我是新手,我发现在编写类时,我必须不断地编写
@property
def example(self):
return self._example
@example.setter
def example(self, example):
if #some conditions here:
self._example = example
我正在做一个项目,其中有十几个这样的项目,所以我试图做一个函数,它将接受一个属性名和一些条件,并为它做一个getter,setter和deleter.
class Util:
@classmethod
def custom_property(cls, prop, conds=None, deletable=False):
def getter(self):
return getattr(self, f'_{prop}')
def setter(self, value):
if conds is None or conds(value):
setattr(self, f'_{prop}', value)
else:
raise ValueError(f'Invalid value for {prop}')
def deleter(self):
if deletable:
del self._value
else:
print("This attribute can't be deleted.")
# setattr(target, prop, property(getter, setter, deleter))
return [getter, setter, deleter]
下面是我try 使用它的一个例子:
from utils import Util
def name_conds(name):
if not isinstance(name, str):
raise TypeError("City name must be a string")
if not name.strip():
raise ValueError("City name cannot be blank")
if not 2 <= len(name) <= 25:
raise ValueError("City name length must be between 2 and 25 characters")
return True
class City:
def __init__(self, name):
self._name = name
[name_getter, name_setter, name_deleter] = Util.custom_property("name", name_conds)
name = property(name_getter, name_setter, name_deleter)
不幸的是,这并不完全有效.如果我创建一个名称为"asdf"的城市并try 将其更改为"a",我会得到正确的错误,即长度错误,但如果我使用名称"a"实例化一个新城市,我可以毫不费力地这样做.人们肯定有某种方式像我一样把属性写出来?此外,正如Util中的注释行所示,我希望能够通过在任何需要属性的类中调用Util.Custom_Property来更快地使用该方法,但这会将该属性添加到Util中(当然,因为它会将其添加到CLS中).似乎无法在City内将类City作为参数,但在City外调用Customer_Property可能意味着City中的函数无法正确引用名称.