python - Python没有在自定义集属性上调用描述符函数
问题描述
我正在尝试创建一个遗留数据类函数并且已经能够成功地覆盖__init__
。我的新问题是属性的__set__
and__get__
方法似乎没有被调用,所以它返回实际属性而不是调用 get 函数将用完全不同的值覆盖属性而不是调用 set()。
def _init_wrapper(self, *props):
names = _filter_names(self) # Get names of all properties
for name, value in zip(names, props):
private = _private_name(name) # Get private name for property
_create_field(self, private) # Create field for property
setattr(self, private, value)
prop = property(lambda i: getattr(i, private), lambda i, v: setattr(i, private, v)) # Return private, set private
setattr(self, name, prop)
def dataclass(cls):
setattr(cls, "__init__", _init_wrapper)
return cls
@dataclass
class Vehicle:
Name = ""
Brand = ""
Speed = 0
x = Vehicle("Foo", "Bar", 100)
print(x.Name)
x.Name = "Baz"
print(x.Name)
输出:
<property object at 0x00000201EFAD2A40>
Baz
我对 setattr、描述符和装饰器非常陌生,所以如果它很明显或者整个方法有问题,我很抱歉。
解决方案
推荐阅读
- java - Starting windows bundle from network-drive use not included JRE?
- javascript - 全局变量的值没有改变,尽管它的局部值正在改变
- java - Tomcact 404 error after deploying my WAR into Tomcat
- angular - Is there a way to set [disabled] with help from a custom validation
- r - R package CMD check
- node.js - Is it possible to send bulk sms with node-smpp (https://github.com/farhadi/node-smpp)?
- android - 如何从当前日期找到这个周末和下一个周末?
- android - 我应该从 Android 客户端还是从 Firebase 函数保存到 Firestore?
- php - PHP循环遍历数组,按周排序并统计每周工作时间
- .net - 如何使用 ASP.NET 标识设置现有数据库?