最好的情况是,我的意思是 Python 和尽可能少的代码行。
我习惯于像这样在 Python 中定义具有属性的类。
class MyClass(object):
def __init__(self):
self.value = 5
然而,我经常发现自己需要确保它self.value
只能采用特定类型的值。过去(来自 PHP OOP 背景)我使用类似于以下的 getter-setter 方法完成了此操作:
def value(self, new_value = -1)
if new_value == -1:
return self.value
if isinstance(new_value, int) and new_value > -1:
self.value = new_value
else:
raise TypeError
self.value
然后我用访问self.value()
,并用 设置它self.value(67)
。通常我会命名self.value
为self.__value
不鼓励直接访问。
我最近发现(或正在发现)描述符。密切关注这里的精彩讨论,我写了一些看起来像这样的东西:
class ValidatedAttribute(object):
def __init__(self, key, kind):
self.key = key
self.kind = kind
def __get__(self, instance, owner):
if self.key not in instance.__dict__:
raise AttributeError, self.key
return instance.__dict__[self.key]
def __set__(self, instance, value):
if not isinstance(value, self.kind):
raise TypeError, self.kind
instance.__dict__[self.key] = value
class MyUsefulClass(object):
a = ValidatedAttribute("a", int)
但我有几个问题!
首先,究竟是MyUsefulClass().a
什么?它是否以某种方式绑定到类的实例的 ValidatedAttribute 类的实例MyUsefulClass
?
其次,我真正想要的是,
class MyUsefulClass(object):
def __init__(self):
self.value = Checker(int, 99)
def Checker(self, kind, default):
# Code for verifying that associated attribute is of type kind.
并以某种方式将属性访问绑定到某种拦截方法,而不必使用整个其他描述符类。
如果我的理解不足,我很抱歉 - 我仍在掌握新型 Python 类。任何正确方向的帮助或指示将不胜感激。