gpt4 book ai didi

python - 运行 super().__init__(value),其中 value 是 @property

转载 作者:行者123 更新时间:2023-11-30 22:49:14 25 4
gpt4 key购买 nike

我只是想了解 Python 在幕后到底是如何处理这个问题的。因此,请看以下代码片段(来自 Brett Slatkin 的《Effective Python》):

class Resistor(object):
def __init__(self, ohms):
self.ohms = ohms
self.voltage = 0
self.current = 0


class VoltageResistor(Resistor):
def __init__(self, ohms):
super().__init__(ohms)
self._voltage = 0

@property
def ohms(self):
return self._ohms

@ohms.setter
def ohms(self, ohms):
if ohms <= 0:
raise ValueError('{o} ohms must be > 0'.format(o=ohms))
self._ohms = ohms

@property
def voltage(self):
return self._voltage

@voltage.setter
def voltage(self, voltage):
self._voltage = voltage
self.current = self._voltage / self.ohms

VoltageResistor(-1) # fails

运行 super()调用会调用属性检查,以便您无法使用零或负值进行实例化。让我感到困惑的是,我认为自从 __init__(ohms)调用正在父类(super class)上运行,它不应该在不同的范围(父类(super class)的范围)中,从而免除调用 @property查看?

最佳答案

在处理对象的属性时,作用域不起作用。考虑以下因素:

class A(object):
def __init__(self):
self.a = 1

def foo():
a = A()
a.a = 2
return a

def bar(a):
print(a.a)

bar(foo())

此示例代码将打印 2。注意,在 bar 范围内,没有办法访问 foo 的范围甚至 A.__init__ 。类实例携带着它的所有属性/属性(以及对其类的引用,该类具有对它的父类(super class)的引用,等等)。

在您的代码中,当您调用 VoltageResistor 时, VoltageResistor 的一个实例创建并传递给__init__self 。当您调用super.__init__(self)时,即VoltageResistor实例被传递到Resistor.__init__ 。当它发生时self.ohms = ohms ,python 看到 self.ohms解析为一个属性,您会收到错误。 tl;博士;这是selfVoltageResistor 的一个实例使用属性时,访问属性的对象才是重要的,而不是当前范围)。

关于python - 运行 super().__init__(value),其中 value 是 @property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39860556/

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