我最近刚与Python中的一个错误作斗争。那是那些愚蠢的新手错误之一,但是它让我思考了Python的机制(我是C
++的老html" target="_blank">程序员,是Python的新手)。我将列出错误的代码并解释如何解决该问题,然后我有两个问题。
场景:我有一个叫做A的类,它有一个字典数据成员,下面是其代码(当然这是简化的):
class A:
dict1={}
def add_stuff_to_1(self, k, v):
self.dict1[k]=v
def print_stuff(self):
print(self.dict1)
使用此代码的类为B类:
class B:
def do_something_with_a1(self):
a_instance = A()
a_instance.print_stuff()
a_instance.add_stuff_to_1('a', 1)
a_instance.add_stuff_to_1('b', 2)
a_instance.print_stuff()
def do_something_with_a2(self):
a_instance = A()
a_instance.print_stuff()
a_instance.add_stuff_to_1('c', 1)
a_instance.add_stuff_to_1('d', 2)
a_instance.print_stuff()
def do_something_with_a3(self):
a_instance = A()
a_instance.print_stuff()
a_instance.add_stuff_to_1('e', 1)
a_instance.add_stuff_to_1('f', 2)
a_instance.print_stuff()
def __init__(self):
self.do_something_with_a1()
print("---")
self.do_something_with_a2()
print("---")
self.do_something_with_a3()
请注意,每次调用都会do_something_with_aX()
初始化类A的新“干净”实例,并在添加前后打印字典。
错误(如果您尚未弄清楚):
>>> b_instance = B()
{}
{'a': 1, 'b': 2}
---
{'a': 1, 'b': 2}
{'a': 1, 'c': 1, 'b': 2, 'd': 2}
---
{'a': 1, 'c': 1, 'b': 2, 'd': 2}
{'a': 1, 'c': 1, 'b': 2, 'e': 1, 'd': 2, 'f': 2}
在类A的第二次初始化中,字典不是空的,而是从最后一次初始化的内容开始,依此类推。我希望他们开始“新鲜”。
解决此“错误”的原因显然是添加了:
self.dict1 = {}
在__init__
类A的构造函数中。但是,这使我感到奇怪:
编辑:按照答案,我现在了解到,通过声明一个数据成员,而不是在__init__
self.dict1或其他地方引用它,我实际上是在C ++ /
Java中定义一个静态数据成员。通过将其称为self.dict1,我将其设为“实例绑定”。
您一直称其为错误的是Python类的已记录的标准行为。
__init__
像最初那样在外部声明dict就是在声明类级变量。最初它只会创建一次,每当您创建新对象时,它都会重复使用此相同的字典。要创建实例变量,请使用self
in声明它们__init__
;就这么简单。
在C++98标准里,只有static const声明的整型成员能在类内部初始化,并且初始化值必须是常量表达式。这些限制确保了初始化操作可以在编译时期进行。例如: int var = 7; class X { static const int m1 = 7; // 正确 const int m2 = 7; // 错误:无static static int m3 =
初始化类成员的确切时间? 在下面的代码中: B&C类的对象是什么时候创建的?并且它是否保证被创建? 一个专业的app到底该不该用这样的代码?
此代码编译: 该代码不: 报告的错误(在 MSVC、gcc 和 clang 中)表明他们认为 构造函数未定义或不是 ,例如。从叮叮当当: 为什么? (可能与这个问题有关,但在使用时应该是完整的;只有仍然不完整。
本文向大家介绍Visual Basic .NET成员初始化,包括了Visual Basic .NET成员初始化的使用技巧和注意事项,需要的朋友参考一下 示例 每个枚举成员可以用一个值初始化。如果未为成员指定值,则默认情况下将其初始化为0(如果它是成员列表中的第一个成员),或者初始化为比前一个成员的值大1的值。
问题内容: 我只是在学习Python,而且我来自C语言,所以如果我之间有任何混淆/混淆,请告诉我。 假设我有以下课程: 这是一个名为的类,该类会使构造函数重载,以便在需要时能够处理不同的参数。 是什么定义之间的差异在只(如上图所示),而不是执行以下操作: 是不是在相同类的变量定义?难道不只是覆盖从传递到的值? 问题答案: 一个是类属性,而另一个是实例属性。它们是不同的,但是它们之间的紧密联系使它们
问题 你想在类被定义的时候就初始化一部分类的成员,而不是要等到实例被创建后。 解决方案 在类定义时就执行初始化或设置操作是元类的一个典型应用场景。本质上讲,一个元类会在定义时被触发, 这时候你可以执行一些额外的操作。 下面是一个例子,利用这个思路来创建类似于 collections 模块中的命名元组的类: import operator class StructTupleMeta(type):