编写Python方法来引用派生类中的Class属性,而不是基类

时间:2014-07-30 04:24:49

标签: class python-3.x polymorphism

作为一名在Java中工作更多的人,我在Python中对类属性的多态引用进行了很多困难。

我想要做的是在基类中有一个方法来修改"静态"基类的变量(又称类属性),但是当从派生类调用方法时,该方法修改派生类的类属性,而不是基类。注意,我没有覆盖派生类中的方法。

例如,我有类似的东西:

class BaseClass:
    itemList = []

    def addItem(thing):
        BaseClass.itemList.append(thing)

class Child1(BaseClass):
    pass

class Child2(BaseClass):
    pass

...

Child1.addItem("foo")

Child2.addItem("bar")

print(str(Child1.itemList))

我喜欢:" foo"

我得到:" foo,bar"

现在,我理解由于" BaseClass.itemList.append(thing)",它将引用基类的class属性。

换句话说,有没有办法避免说" BaseClass.itemList",但保持静态,或者我是否需要覆盖每个子类中的方法?

1 个答案:

答案 0 :(得分:1)

你可以有一个“静态”类变量,可以被类的每个实例更改:

class BaseClass:
    itemList = []    
    def addItem(self, thing):
        self.itemList.append(thing)


class Child1(BaseClass):
    itemList = []       


class Child2(BaseClass):
    itemList = []       

# each class has its own "itemList"
# now we can instantiate each class and use the different itemLists:

c1 = Child1()
c1.addItem("foo")

c2 = Child2()
c2.addItem("bar")

c3 = Child1()
c3.addItem("foo2")

print(str(Child1.itemList)) # prints: ['foo', 'foo2']
print(str(Child2.itemList)) # prints: ['bar']