在 python 工作下一个代码:
class MyClass(object):
field = 1
>>> MyClass.field
1
>>> MyClass().field
1
当我想要自定义字段的返回值时,我使用下一个代码:
class MyClass(object):
def __getattr__(self, name):
if name.startswith('fake'):
return name
raise AttributeError("%r object has no attribute %r" %
(type(self).__name__, name))
>>> MyClass().fake
fake
但:
>>> MyClass.fake
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: class MyClass has no attribute 'fake'
好的,对于我可以使用下一个代码的类:
class MyClassMeta(type):
def __getattr__(cls, name):
if name.startswith('fake'):
return name
raise AttributeError("%r object has no attribute %r" %
(type(self).__name__, name))
class MyClass(object):
__metaclass__ = MyClassMeta
>>> MyClass.fake
fake
但:
>>> MyClass().fake
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'MyClass' object has no attribute 'fake'
为了解决这个问题,我使用下一个代码:
class FakeAttrMixin():
def __getattr__(self, name):
if name.startswith('fake'):
return name
raise AttributeError("%r object has no attribute %r" %
(type(self).__name__, name))
class MyClassMeta(type, FakeAttrMixin):
pass
class MyClass(object, FakeAttrMixin):
__metaclass__ = MyClassMeta
>>> MyClass.fake
fake
>>> MyClass().fake
fake
MyClass.fake
将调用__getattr__
withMyClass
和fake
arguments。
MyClass().fake
将调用实例和__getattr__
参数。MyClass
fake
__getattr__
如果我只在我的 mixin 上实现逻辑并且不使用self
参数,那也没关系。
我可以编写更漂亮的类和实例的自定义值解析吗?如果与方法相比,为什么值解析和定义的field
工作MyClass.field
方式不同?因为当我想首先在实例中搜索时,然后在课堂上,但我不明白为什么以另一种方式工作。MyClass().field
MyClass(object): field = 1
__getattr__
field
__getattr__