在超类方法中设置子类的属性

时间:2013-03-25 06:56:08

标签: python oop

我有以下情况:

class Baseclass(object):
    extra_fields = []
    @classmethod
    def extend(cls, key):
        cls.extra_fields.append(key)

class A(Baseclass):
    pass

class B(Baseclass):
    pass

A.extend("foo")

现在,extend Baseclass将被调用,将Baseclass.extra_fields设置为["foo"]。然后,A.extra_fields将为["foo"],但B.extra_fields也是如此。

extend中是否只有一种方法只能修改调用它的子类(不在所有子类上定义extend,因为这些可能事先不知道)?

2 个答案:

答案 0 :(得分:3)

class Baseclass(object):    
    @classmethod
    def extend(cls, key):
        if not 'extra_fields' in cls.__dict__:
            cls.extra_fields=[]
        cls.extra_fields.append(key)   

class A(Baseclass):
    pass

class B(Baseclass):
    pass

A.extend("foo")

答案 1 :(得分:1)

如何为每个子类定义自己的extra_fields

class Baseclass(object):
    @classmethod
    def extend(cls, key):
        cls.extra_fields.append(key)

class A(Baseclass):
    extra_fields = []

class B(Baseclass):
    extra_fields = []

A.extend("foo")

(您可以使用某些元类魔法自动执行此操作。)