- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Python @property inheritance the right way解释如何调用父 setter 。
class Number:
def __init__(self):
self._value = None
@property
def value(self):
assert self._value is not None
return self._value
@value.setter
def value(self, new_value):
self._value = new_value
class Integer(Number):
@property
def value(self):
return super().value
@value.setter
def value(self, new_value):
_value = int(new_value)
super(Integer, type(self)).value.fset(self, _value) # <----- OK with using type(self)
# super(Integer, self).value.fset(self, _value) # <----- Assert error with self
i = Integer()
i.value = 1 # cause assertion error with "super(Integer, self)"
print(i.value)
使用 super(Integer, type(self)).value.fset(self, _value)
,i.value = 1
按预期调用 setter 。
使用 super(Integer, self).value.fset(self, _value)
,i.value = 1
调用 getter 而不是 setter,因此导致断言错误。
AssertionError Traceback (most recent call last)
<ipython-input-8-2c57a07c128d> in <module>
35
36 i = Integer()
---> 37 i.value = 1
38 print(i.value)
<ipython-input-8-2c57a07c128d> in value(self, new_value)
32 _value = int(new_value)
33 #super(Integer, type(self)).value.fset(self, _value)
---> 34 super(Integer, self).value.fset(self, _value)
35
36 i = Integer()
<ipython-input-8-2c57a07c128d> in value(self)
10 @property
11 def value(self):
---> 12 assert self._value is not None
13 return self._value
请帮助理解为什么 super(Integer, self).value.fset(self, _value)
尽管调用了 fset 但会转到 getter 而不是 setter
。阅读文档和文章,在我看来传递对象 self
而不是类型/类 type(self)
是访问绑定(bind)到实例本身的方法的正确方法, 但它不起作用。
super([type[, object-or-type]])
The object-or-type determines the method resolution order to besearched. The search starts from the class right after the type.
For example, if mro of object-or-type is D -> B -> C -> A ->object and the value of type is B, then super() searches C -> A ->object.
The mro attribute of the object-or-type lists the methodresolution search order used by both getattr() and super(). Theattribute is dynamic and can change whenever the inheritance hierarchyis updated.
Supercharge Your Classes With Python super()
In Python 3, the super(Square, self) call is equivalent to theparameterless super() call. The first parameter refers to the subclassSquare, while the second parameter refers to a Square object which, inthis case, is self. You can call super() with other classes as well:
def surface_area(self):
face_area = super(Square, self).area()
return face_area * 6
def volume(self):
face_area = super(Square, self).area()
return face_area * self.lengthWhat about the second parameter? Remember, this is an object that isan instance of the class used as the first parameter. For an example,isinstance(Cube, Square) must return True.
By including an instantiated object, super() returns a bound method: amethod that is bound to the object, which gives the method theobject’s context such as any instance attributes. If this parameter isnot included, the method returned is just a function, unassociatedwith an object’s context.
最佳答案
super(Integer, self).value.fset(self, _value)
的问题(或更简单的等价物,super().value.fset(self, _value)
) 发生在您到达 fset
之前。描述符协议(protocol)参与对一个实例的所有查找,使其通过执行 super(Integer, self).value
(或 super().value
)简单地调用 getter ).这就是为什么您继承的 setter/getter 首先起作用的原因;它调用了 property
描述符,并获得了它产生的值。
为了绕过描述符协议(protocol)(更准确地说,从实例转移到类级别的调用,其中 property
在类级别场景中没有做任何特殊的事情),您需要执行查找类本身,而不是它的一个实例。 super(Integer, type(self))
调用 super
的形式返回一个 super
对象绑定(bind)在类级别,而不是实例级别,允许您检索原始描述符本身,而不是调用描述符并获取它产生的值。获得原始描述符后,您可以访问和调用附加到它的 fset
函数。
当 super
不 涉及时,这与您遇到的问题相同。如果你有一个 Number
的实例,并且想直接访问 fset
函数(而不是通过赋值隐式调用它),你必须这样做:
num = Number()
type(num).value.fset(num, 1)
因为在做:
num.value.fset(num, 1)
当您检索 num.value
时失败(获取 getter 生成的 None
),然后尝试在 上查找
。fset
无
关于python - 为什么这个父类setter调用使用type(self)而不是self?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66512930/
假设a是张量,那么有什么区别: 类型(a) a.类型 a.type() 我找不到区分这些的文档。 最佳答案 type 是 python 内置方法。 它将返回对象的类型。喜欢 torch.Tensor.
什么是 Type 1 的居民的例子?两者都不是 Type也不是Type的居民?在 Idris REPL 中进行探索时,我无法想出任何东西。 更准确地说,我正在寻找一些 x除了 Type产生以下结果:
我找到了一些资源,但我不确定我是否理解。 我找到的一些资源是: http://help.sap.com/saphelp_nw70/helpdata/en/fc/eb2ff3358411d1829f00
这两个函数原型(prototype)有什么区别? void apply1(double(f)(double)); void apply2(double(*f)(double)); 如果目标是将提供的函
http://play.golang.org/p/icQO_bAZNE 我正在练习使用堆进行排序,但是 prog.go:85: type bucket is not an expression
假设有一个泛型定义的方法信息对象,即一个方法信息对象,这样的方法Info.IsGenericMethodDefinition==TRUE:。也可以说它们也有一个泛型参数列表:。我可以使用以下命令获取该
在具有依赖类型的语言中,您可以使用 Type-in-Type 来简化语言并赋予它很多功能。这使得语言在逻辑上不一致,但如果您只对编程感兴趣而不对定理证明感兴趣,这可能不是问题。 在 Cayenne
根据 Nim 手册,变量类型是“静态类型”,而变量在内存中指向的实际值是“动态类型”。 它们怎么可能是不同的类型?我认为将错误的类型分配给变量将是一个错误。 最佳答案 import typetrait
假设您有以下结构和协议(protocol): struct Ticket { var items: [TicketItem] = [] } struct TicketItem { } prot
我正在处理一个 EF 问题,我发现它很难调试...以前,在我的系统中有一个表类型继承设置管理不同的用户类型 - 所有用户共有的一种根类型,以及大致基于使用该帐户的人员类型的几种不同的子类型。现在,我遇
这是我的 DBManager.swift import RealmSwift class DBManager { class func getAllDogs() -> [Dog] {
我正在尝试使用傅里叶校正图像中的曝光。这是我面临的错误 5 padded = np.log(padded + 1) #so we never have log of 0 6 g
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improve
请考虑以下设置: protocol MyProcotol { } class MyModel: MyProcotol { } enum Result { case success(value:
好吧,我将我的 python 项目编译成一个可执行文件,它在我的电脑上运行,但我将它发送给几个 friend 进行测试,他们都遇到了这个错误。我以前从未见过这样的错误。我使用 Nuitka 来编译代码
当我尝试训练我的模型时"ValueError: Type must be a sub-type of ndarray type"出现在 line x_norm=(np.power(x,2)).sum(
我尝试在另一个类中打断、计数然后加入对象。所以我构建协议(protocol): typealias DataBreaker = () -> [Double] typealias DataJoiner
我正在使用 VS 2015 更新 3、Angular 2.1.2、Typescript 2.0.6 有人可以澄清什么是 typings 与 npm @types 以及本月很难找到的任何其他文档吗? 或
我正在考虑从 VS2010 更改为 Mono,因此我通过 MoMA 运行我的程序集,看看我在转换过程中可能遇到多少困难。在生成的报告中,我发现我不断收到此错误: bool Type.op_Equali
主要问题 不太确定这是否可能,但由于我讨厌 Typescript 并且它使我的编码变得困难,我想我会问只是为了确定。 interface ISomeInterface { handler: ()
我是一名优秀的程序员,十分优秀!