gpt4 book ai didi

python - 为什么属性引用在 Python 继承中会这样?

转载 作者:IT老高 更新时间:2023-10-28 20:51:48 26 4
gpt4 key购买 nike

以下看起来很奇怪.. 基本上,somedata 属性似乎在从 the_base_class 继承的所有类之间共享。

class the_base_class:
somedata = {}
somedata['was_false_in_base'] = False


class subclassthing(the_base_class):
def __init__(self):
print self.somedata


first = subclassthing()
{'was_false_in_base': False}
first.somedata['was_false_in_base'] = True
second = subclassthing()
{'was_false_in_base': True}
>>> del first
>>> del second
>>> third = subclassthing()
{'was_false_in_base': True}

__init__ 函数中定义 self.somedata 显然是解决这个问题的正确方法(因此每个类都有自己的 somedata 字典) - 但是什么时候需要这种行为呢?

最佳答案

你是对的,somedata 在类的所有实例及其子类之间共享,因为它是在类定义 时创建的。线条

somedata = {}
somedata['was_false_in_base'] = False

在定义类时执行,即当解释器遇到 class 语句时 - not 在创建实例时执行(想想 Java 中的静态初始化程序 block )。如果类实例中不存在属性,则检查类对象的属性。

在类定义时,您可以运行任意代码,如下所示:

 import sys
class Test(object):
if sys.platform == "linux2":
def hello(self):
print "Hello Linux"
else:
def hello(self):
print "Hello ~Linux"

在 Linux 系统上,Test().hello() 将打印 Hello Linux,在所有其他系统上,将打印其他字符串。

相反,__init__ 中的对象是在 instantiation 时间创建的,并且仅属于实例(当它们被分配给 self 时):

class Test(object):
def __init__(self):
self.inst_var = [1, 2, 3]

在类对象而不是实例上定义的对象在许多情况下很有用。例如,您可能希望缓存类的实例,以便可以共享具有相同成员值的实例(假设它们应该是不可变的):

class SomeClass(object):
__instances__ = {}

def __new__(cls, v1, v2, v3):
try:
return cls.__insts__[(v1, v2, v3)]
except KeyError:
return cls.__insts__.setdefault(
(v1, v2, v3),
object.__new__(cls, v1, v2, v3))

大多数情况下,我将类体中的数据与元类或通用工厂方法结合使用。

关于python - 为什么属性引用在 Python 继承中会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/206734/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com