3 回答
TA贡献1790条经验 获得超9个赞
您可以通过使用以下property函数来使用 getter 和 setter 方法:
class Operate:
def __init__(self, type):
self.type = type
@property
def type(self):
return self._type
@type.setter
def type(self, value):
assert value in ('abc', 'xyz')
self._type = value
以便:
o = Operate(type='123')
会导致:
Traceback (most recent call last):
File "test.py", line 18, in <module>
o = Operate(type='123')
File "test.py", line 8, in __init__
self.type = type
File "test.py", line 15, in type
assert value in ('abc', 'xyz')
AssertionError
TA贡献1995条经验 获得超2个赞
assert isinstance(obj)
是你如何测试一个对象的类型。
if item in container: ...
是如何测试对象是否在容器中。
是在init方法中还是在其他方法中执行此操作取决于您,这取决于您看起来更清洁,或者您是否需要重用该功能。
有效值列表可以传递到init方法或硬编码到init方法中。它也可以是类的全局属性。
TA贡献1828条经验 获得超3个赞
你可以用描述符来做到这一点。我可以设计的唯一优点是将验证放在另一个类中 - 使使用它的类不那么冗长。不幸的是,您必须为每个属性制作一个具有唯一验证的属性,除非您想包含成员资格测试和/或测试实例的选项,这不应该使其过于复杂。
from weakref import WeakKeyDictionary
class RestrictedAttribute:
"""A descriptor that restricts values"""
def __init__(self, restrictions):
self.restrictions = restrictions
self.data = WeakKeyDictionary()
def __get__(self, instance, owner):
return self.data.get(instance, None)
def __set__(self, instance, value):
if value not in self.restrictions:
raise ValueError(f'{value} is not allowed')
self.data[instance] = value
使用时,必须将描述符实例分配为类属性
class Operate:
__type_ = RestrictedAttribute(('red','blue'))
def __init__ (self, att:str, type_:str, value: [], mode=None, action=None):
self.__att = att
self.__type_ = type_
self.__mode = mode
self.__value_list = value
self.__action = action
正在使用:
In [15]: o = Operate('f',type_='blue',value=[1,2])
In [16]: o._Operate__type_
Out[16]: 'blue'
In [17]: o._Operate__type_ = 'green'
Traceback (most recent call last):
File "<ipython-input-17-b412cfaa0cb0>", line 1, in <module>
o._Operate__type_ = 'green'
File "P:/pyProjects3/tmp1.py", line 28, in __set__
raise ValueError(msg)
ValueError: green is not allowed
添加回答
举报