我有一个类,我正在处理它,它存储了Employees的详细信息,我希望所有的属性都能被保护,并且可以用特定的逻辑来设置和获取,但不是所有的都是以唯一的方式,我希望同样的逻辑可以应用到我的_f_name
和_l_name
属性上,我希望同样的逻辑可以应用到接受布尔值和其他一般情况的属性上。
我得到了第一个属性:
@property
def f_name(self):
return self.f_name
@f_name.setter
def f_name(self, f_name):
if f_name != str(f_name):
raise TypeError("Name must be set to a string")
else:
self._f_name = self._clean_up_string(f_name)
@f_name.deleter
def available(self):
raise AttributeError("Can't delete, you can only change this value.")
如何将相同的函数和属性应用于其他属性?
谢谢!
2条答案
按热度按时间piwo6bdm1#
虽然定义
property
的子类看起来是可能的,但是有太多关于 * 特定 * 属性如何工作的细节留给getter和setter来定义,这意味着定义一个定制的类似属性的描述符会更直接。__set_name__
构造getter和setter将使用的示例属性的名称。__get__
充当getter,使用getattr
从给定对象检索构造的属性名称。__set__
在使用setattr
设置构造的属性名称之前验证并修改该值。__del__
仅引发属性错误,而与调用者试图从哪个对象移除属性无关。下面是一个简单的演示,它使所有分配给描述符的值都变成标题大小写。
也可以将cleaning函数作为参数传递给
CleanableStringProperty
本身,而不是obj
预期提供的函数。__init__
和__set__
将修改为并且描述符将被初始化为
请注意,
Foo
不再负责提供清洁方法。rm5edbpk2#
属性只是描述符的实现,因此要创建自定义属性,需要一个具有
__get__
、__set__
和/或__delete__
方法的对象。在您的情况下,您可以这样做:
让我们定义一个示例类来使用它:
并测试:
型