Python 为什么除非使用顺序初始化,否则dict不包含类成员?
我需要访问类方法中的类成员列表,特别是在Python 为什么除非使用顺序初始化,否则dict不包含类成员?,python,oop,Python,Oop,我需要访问类方法中的类成员列表,特别是在\uuu init\uuu()函数中,以便对它们进行整体初始化。我试图使用\uu dict\uu和变量(self)但不幸的是,它们返回空的dict对象,除非使用直接初始化,例如self.y=5问题是;为什么它是空的,我如何立即初始化它们,或者基本上是适合批量初始化的变量\uuu dict\uuuu? 多谢各位 示例代码如下所示: 输出: Python版本:3.8.5 已测试的操作系统:windows 10、MacOS 10.15.7和Linux Cent
\uuu init\uuu()
函数中,以便对它们进行整体初始化。我试图使用\uu dict\uu
和变量(self)
但不幸的是,它们返回空的dict
对象,除非使用直接初始化,例如self.y=5
问题是;为什么它是空的,我如何立即初始化它们,或者基本上是适合批量初始化的变量\uuu dict\uuuu
?
多谢各位
示例代码如下所示:
输出:
- Python版本:3.8.5
- 已测试的操作系统:windows 10、MacOS 10.15.7和Linux CentOS 7
\uuuu dict\uuu
仅保存实例属性<示例中的code>x和y
是类属性self.x
是一个可以表示许多不同事物的表达式;实际结果取决于哪个查找首先成功
当您进行类似于self.x=5
的赋值时,值5
与self.\uuu dict\uu
中的键x
相关联
当您尝试获取
self.x
的值时,首先尝试的是self.\uuu dict\uuu['x']
。但如果失败,它会尝试P.x
。如果失败,它将在MRO中的P
的每个祖先中检查x
作为属性,直到找到一个值。如果未找到任何内容,则会引发属性错误
。(这忽略了\uuuuGetAttr\uuuuuuuuuuuu
或\uuuuuuuGetAttribute\uuuuuuuu
的使用,但足以解释self.x
在self.\uuuuu dict\uuuuuuuu
为空时如何提供值。)仅保存实例属性<示例中的code>x
和y
是类属性self.x
是一个可以表示许多不同事物的表达式;实际结果取决于哪个查找首先成功
当您进行类似于self.x=5
的赋值时,值5
与self.\uuu dict\uu
中的键x
相关联
当您尝试获取
self.x
的值时,首先尝试的是self.\uuu dict\uuu['x']
。但如果失败,它会尝试P.x
。如果失败,它将在MRO中的P
的每个祖先中检查x
作为属性,直到找到一个值。如果未找到任何内容,则会引发属性错误
。(这忽略了\uuuu getattr\uuuuuuuuuuuuuuuuuuu
或\uuuuuuuu getattribute\uuuuuuuuuuu
的使用,但足以解释self.x
为空时如何提供值。)Pythnon类实例是动态的-它们没有变量,除非您将它们放在那里。他们也不知道这些变量应该是什么。通常通过在类中的\uuuu init\uuuu
或其他方法中逐个添加它们(例如,self.foo=1
)来完成。但是,如果您有不同的变量源,可以通过添加到self.\uu dict\uu
来实现。假设我有一个CSV文件中的行,我想要一个由该行初始化的类。我可以
class P:
cell_names = ('a', 'b', 'c')
def __init__(self, row):
print("before", self.__dict__)
self.__dict__.update(zip(self.cell_names, row))
print("after", self.__dict__)
p = P((1,2,3))
print("attributes", p.a, p.b, p.c)
输出
before {}
after {'a': 1, 'b': 2, 'c': 3}
attributes 1 2 3
当然,还有其他初始化方法。这取决于“整体”数据的来源
如果要添加所有关键字参数,可以
class P1:
def __init__(self, **kw):
self.__dict__.update(kw)
p = P1(a=1, b=3, c=3)
print("P2", p.a, p.b, p.c)
Pythnon类实例是动态的——在您将它们放在那里之前,它们没有变量。他们也不知道这些变量应该是什么。通常通过在类中的
\uuuu init\uuuu
或其他方法中逐个添加它们(例如,self.foo=1
)来完成。但是,如果您有不同的变量源,可以通过添加到self.\uu dict\uu
来实现。假设我有一个CSV文件中的行,我想要一个由该行初始化的类。我可以
class P:
cell_names = ('a', 'b', 'c')
def __init__(self, row):
print("before", self.__dict__)
self.__dict__.update(zip(self.cell_names, row))
print("after", self.__dict__)
p = P((1,2,3))
print("attributes", p.a, p.b, p.c)
输出
before {}
after {'a': 1, 'b': 2, 'c': 3}
attributes 1 2 3
当然,还有其他初始化方法。这取决于“整体”数据的来源
如果要添加所有关键字参数,可以
class P1:
def __init__(self, **kw):
self.__dict__.update(kw)
p = P1(a=1, b=3, c=3)
print("P2", p.a, p.b, p.c)
你是说“实例变量列表”吗?您使用什么数据源对它们进行大规模初始化?@tdelaney当然,实例变量不在字典中。您是指“实例变量列表”吗?您使用什么数据源对它们进行大规模初始化?@tdelaney当然,实例变量不在字典中。您注意到了rational描述中非常有用的概念,谢谢。您注意到了rational描述中非常有用的概念,谢谢。谢谢。这是一个很好的技巧,使用zip完成任务。我认为应该有一些你提到的更明确的方法。我尝试将一个扩展字典变量作为参数
**a
发送到\uuuu init\uuu()
方法中,然后使用它们初始化实例变量,而不逐个初始化,因为它们的数量非常多。再次感谢您,您的第二次编辑和添加的代码完全解决了这个问题谢谢您。这是一个很好的技巧,使用zip完成任务。我认为应该有一些你提到的更明确的方法。我尝试将一个扩展字典变量作为参数**a
发送到\uuuu init\uuu()
方法中,然后使用它们初始化实例变量,而不逐个初始化,因为它们的数量非常多。再次感谢您,您的第二次编辑和添加的代码完全解决了这个问题