Python对象会继承彼此的属性吗?

时间:2019-11-13 03:12:40

标签: python oop

我有一个程序,我打算在其中比较一个类的两个不同实例的字典内容(我打算将此作为比较FIB表的路由协议仿真),并且似乎在一个对象,另一个对象的字典更新了相同的信息。

class bar:
    myName = ""
    mydict1 = {'a': '', 'b': ''}
    mydict2 = {}

    def __init__(self, name):
        self.myName = name

    def addItem(self, x, y):
        self.mydict2[x] = y

foo = bar('a')

foo.addItem('a', 'test')
print(foo.myName, foo.mydict2)

foo2 = bar('b')
print(foo2.myName, foo2.mydict2)

此输出为:

a {'a': 'test'}
b {'a': 'test'}

我不确定这是否是Python中的OOP怪癖,或者我是否缺少其他东西,感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

您在__init__外部声明的所有属性都是 class 属性(由所有实例和类本身共享),而不是 instance 属性。如果您需要每个实例的唯一值,则必须在__init__内部对其进行初始化,方法是将它们附加到self(正在初始化的实例)上,例如:

class bar:

    def __init__(self, name):
        self.myName = name
        self.mydict1 = {'a': '', 'b': ''}
        self.mydict2 = {}

    def addItem(self, x, y):
        self.mydict2[x] = y

旁注:请阅读Python风格指南PEP8。您的命名约定显然与众不同,这使您的代码更难阅读(特别是,除了int之类的内置代码外,基本上每个人都使用CapWords作为类名,而lowercaselowercase_with_underscores代表其他所有内容。

答案 1 :(得分:0)

由于mydict2是在类中而不是在__init__方法中分配的,因此它是类的属性,而不是对象的属性。要获得预期的行为,请在self.mydict2方法中分配一个__init__属性。

如果您习惯于Java之类的语言,这可能会令人惊讶。 Java中的行为是,当您在类中声明字段时,除非明确声明为static,否则它属于实例,并且如果该字段具有初始化程序,则在创建对象时将执行初始化程序。 / p>

在Python中,创建类时将执行类主体中的所有代码。 (从技术上讲,这包括方法定义,但是请注意,执行方法定义只会导致方法被声明,而不是被调用。)由于代码仅执行一次,因此仅创建一个字典,并且该类保留对此的引用,尽管可以通过该类的任何实例访问此引用。