首页 > 解决方案 > 对静态属性的引用会产生 NameError

问题描述

我有以下具有两个静态属性的类(每个实例通用)

class Seller:
    fields = {
        "url": True,
        "availability": False,
        "visibility": False,
        "country": False,
        "origin_website": False
    }
    required_fields = [f for f in Seller.fields.keys() if Seller.fields[f]]

    def __init__(self):
        ...

尝试创建卖方实例时,出现以下错误。

required_fields = [f for f in Seller.fields.keys() if fields[f]]
NameError: name 'Seller' is not defined

我试图删除Seller引用,但它会产生另一个错误

required_fields = [f for f in fields.keys() if fields[f]]
NameError: name 'fields' is not defined

我知道就静态变量而言,我可能会错过一些明显的东西,但无法弄清楚究竟是什么。

标签: pythonstatic

解决方案


您不能Seller从静态属性访问类,因为这些是在类被实例化且尚未绑定到名称时被实例化的Seller。有几种方法可以解决这个问题:

1.使用继承

class SellerBase:
    fields = {
        "url": True,
        "availability": False,
        "visibility": False,
        "country": False,
        "origin_website": False
    }


class Seller(SellerBase):
    required_fields = [f for f in SellerBase.fields.keys() if SellerBase.fields[f]]

    def __init__(self):
        ...

2.稍后分配属性

class Seller:
    fields = {
        "url": True,
        "availability": False,
        "visibility": False,
        "country": False,
        "origin_website": False
    }

    def __init__(self):
        ...

Seller.required_fields = [f for f in Seller.fields.keys() if Seller.fields[f]]

3. 将字段移出Seller

fields = {
    "url": True,
    "availability": False,
    "visibility": False,
    "country": False,
    "origin_website": False
}


class Seller:
    required_fields = [f for f in fields.keys() if fields[f]]

    def __init__(self):
        ...

我很可能会使用选项 3,但这实际上取决于您的用例。

这回答了你的问题了吗?


推荐阅读