- 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/
因此,我需要获取在为其赋值时调用的 setter 的名称。像这样: var b = {}; var a = { set hey(value) { b[] = value; } } 我希望 se
我是 Android 编程的新手(~ 2 个月)有必要为几十个不同的变量设置 getter 吗? 例如—— //Yes I realise that this isn't 'dozens' publi
import Control.Lens import Control.Lens.TH data Foo = Foo { _bar, _baz :: Int } makeLenses ''
我有点困惑:我可以覆盖 setter/getter 但仍然使用 super setter/getter 吗?如果是 - 怎么办? 用例: class A { void set value(num
我有一个接收消息的应用程序。消息中存在可编辑的字段。当字段更改时,应将其保存到数据库中。不幸的是,setter 仅在 setter 的范围内更改给定字段的值。知道为什么会发生这种情况吗?这是 gett
C# 中有没有一种方法可以让 setter 从“某物”继承,这样每次为特定基类及其继承者调用 setter 时,我都可以运行一些代码? 我想做的是在我的基类上有一个名为 IsValid 的 bool
可能是一个我无法解决的非常简单的问题 - 我从 C# 开始,需要使用 getter/setter 方法向数组添加值,例如: public partial class Form1 : Form {
这两个属性实现有什么区别? public override string A { get { return "s"; } set { } } public override strin
是否可以使用 abc.abstractproperty 创建一个具体的 getter 但将 setter 抽象为每个继承类的不同。我为每个子类处理不同的 val 设置。 例如。 @abstractpr
我在某处看到类似下面的内容,想知道它是什么意思。我知道他们是getter和setter,但是想知道为什么字符串Type是这样定义的。谢谢你帮助我。 public string Type { get;
Public class Example { private int number; public Example(int number){ this.number =
假设我有这样的代码: public response MyMethod(Request req) { String id = req.getFirst().geId(); } 我已经模拟了主对
允许这样做: public int Age { get; set; } 但是应用程序是否为变量创建/分配空间?我经常这样做 private int age = 0; public int Age {
我有一个条件,我构造字符串 (finalValue) 的方式是基于我在输入中获得的非空值的数量。所以我想知道是否可以用一个不同的参数为字符串 (finalValue) 重载 setter 方法并根据我
例如,在这段代码中 var o = { set a(value) {this.b = value}, get a() {return this.b} } 是否有可能获得对 o.a 的 sett
我一直在努力了解 getter 和 setter,但没有深入了解。我读过 JavaScript Getters and Setters和 Defining Getters and Setters只是没
我想在我的类中添加一个 getter 和 setter。然而,setter 应该接收一个 querySelector,但 getter 返回一个新类型 pageSections。 我的问题是 gett
使用有什么好处: private var _someProp:String; public function set someProp(value:String):void { _somePr
当从域类调用它时,我想在我的 setter 中执行一些操作,而不是从 hibernate 中调用它时。此外,我正在使用 session 工厂,因此我无法使用 @PostLoad 来触发标志! 有人对此
人员类别: public class Person { private String firstName; private String lastName; public Pe
我是一名优秀的程序员,十分优秀!