Python对象相互继承';谁的财产?

Python对象相互继承';谁的财产?,python,oop,Python,Oop,我有一个程序,其中我打算比较一个类的两个不同实例的字典的内容(我打算将其作为一个路由协议模拟,其中比较FIB表),并且似乎当我在一个对象中更新字典时,另一个对象的字典更新了相同的信息 class bar: myName = "" mydict1 = {'a': '', 'b': ''} mydict2 = {} def __init__(self, name): self.myName = name def addItem(self,

我有一个程序,其中我打算比较一个类的两个不同实例的字典的内容(我打算将其作为一个路由协议模拟,其中比较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的一个怪癖,还是我遗漏了其他东西,请hanks帮忙

您在
外部声明的所有属性都是类属性(由所有实例和类本身共享),而不是实例属性。如果希望每个实例的值都是唯一的,则必须在
\uuuu init\uuuu
内部将其初始化,方法是将其附加到
self
(正在初始化的实例),例如:


旁注:请阅读Python风格指南。您的命名约定明显与众不同,使代码更难阅读(特别是,除了内置的
int
,基本上每个人都使用
CapWords
作为类名,而
lowercase
lowercase_加下划线
用于几乎所有其他内容).

您在
\uuuuu init\uuuu
之外声明的所有属性都是类属性(由所有实例和类本身共享),而不是实例属性。如果希望每个实例的值都是唯一的,则必须在
\uuuu init\uuuu
内部将其初始化,方法是将其附加到
self
(正在初始化的实例),例如:


旁注:请阅读Python风格指南。您的命名约定明显与众不同,使代码更难阅读(特别是,除了内置的
int
,基本上每个人都使用
CapWords
作为类名,而
lowercase
lowercase_加下划线
用于几乎所有其他内容).

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

如果您习惯了Java这样的语言,这可能会令人惊讶。Java中的行为是,当您在类中声明一个字段时,它属于一个实例,除非它显式声明为
static
,并且如果该字段具有初始值设定项,则在创建对象时执行该初始值设定项


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

因为
mydict2
是在类中而不是在
\uuuuu init\uuuu
方法中分配的,所以它是类的属性,而不是对象的属性。要获得预期的行为,请在
\uuuu init\uuu
方法中指定一个
self.mydict2
属性

如果您习惯了Java这样的语言,这可能会令人惊讶。Java中的行为是,当您在类中声明一个字段时,它属于一个实例,除非它显式声明为
static
,并且如果该字段具有初始值设定项,则在创建对象时执行该初始值设定项


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

这正是我所需要的!非常感谢。这正是我需要的!非常感谢。这正是我需要的!非常感谢。这正是我需要的!非常感谢。
class bar:

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

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