Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么除非使用顺序初始化,否则dict不包含类成员?_Python_Oop - Fatal编程技术网

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()
方法中,然后使用它们初始化实例变量,而不逐个初始化,因为它们的数量非常多。再次感谢您,您的第二次编辑和添加的代码完全解决了这个问题