我有一个Parent类和一个继承的子类,我想知道如何在我的Parent类中访问子类变量。

我试过了,但失败了-

class Parent(object):
    def __init__(self):
        print x

class Child(Parent):
    x = 1;

x = Child();

错误:-
NameError: global name 'x' is not defined

这个问题与我们继承表单类的Django表单有关
并声明一些类变量。

例如:-

我的表格看起来像这样
from django import forms

class EmployeeForm(forms.Form):
      fname = forms.CharField(max_length=100)
      lname = forms.CharField(max_length=100)

我相信表单字段被视为类变量,并以某种方式传递给父类。

最佳答案

Django使用元类来做到这一点。 (Relevant Django source)

这是相关代码的简化示例:

class Field(object):
    def __init__(self, *args):
        self.args = args

    def __repr__(self):
        return "Form(%s)" % (', '.join(map(repr, self.args)),)


class Meta(type):
    def __new__(mcs, name, bases, attrs):
        field_list = []
        for k,v in attrs.items():
            if isinstance(v, Field):
                field_list.append(v)

        cls = type.__new__(mcs, name, bases, attrs)

        cls.fields = field_list

        return cls


class Form(object):
    __metaclass__ = Meta


class MyForm(Form):
    fe1 = Field("Field1", "Vars1")
    fe2 = Field("Field2", "Vars2")
    x = "This won't appear"


form_fields = MyForm.fields
print(form_fields)

这里有许多关于Python元类(example)的问题,所以我不会尝试重新解释这个概念。

在这种情况下,当您创建类MyForm时,将检查每个类属性是否是Field的实例。如果是,它们将被添加到列表(field_list)。

创建该类,然后将.fields属性添加到该类,即field_list,这是Field元素的列表。

然后,您可以通过<FormSubclass>.fields或在本示例中为MyForm.fields来访问表单字段。

编辑:

值得注意的是,您无需使用类似以下内容的元类语法糖就可以完成非常相似的功能:
class Field(object):
    def __init__(self, *args):
        self.args = args

    def __repr__(self):
        return "Form(%s)" % (', '.join(map(repr, self.args)),)


class Form(object):
    def __init__(self):
        self._fields = None

    def fields(self):
        if self._fields is None:
            field_list = []
            for k in dir(self):
                v = getattr(self, k)
                if isinstance(v, Field):
                    field_list.append(v)
            self._fields = field_list

        return self._fields


class MyForm(Form):
    def __init__(self):
        Form.__init__(self)
        self.fe1 = Field("Field1", "Vars1")
        self.fe2 = Field("Field2", "Vars2")
        self.x = "This won't appear"


form_fields = MyForm().fields()
print(form_fields)  # [Form('Field1', 'Vars1'), Form('Field2', 'Vars2')]

关于python - 在父类中访问子类变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29565062/

10-15 15:51