【发布时间】:2019-01-26 01:34:51
【问题描述】:
我正在研究描述符以及它们是如何在属性和函数背后使用的机制。当我们实现描述符与使用属性时,我对如何查找属性有点困惑。
class NonDataDescriptor(object):
def __get__(self, instance, owner):
return 'non-data descriptor'
class DataDescriptor(object):
def __get__(self, instance, owner):
return 'data descriptor'
def __set__(self, instance, value):
pass
class MyClass(object):
descriptor_one = NonDataDescriptor()
descriptor_two = DataDescriptor()
def __init__(self):
self.descriptor_one = 'hello'
self.descriptor_two = 'goodbye'
mc = MyClass()
print(mc.descriptor_one)
print(mc.descriptor_two)
输出是:
hello
data descriptor
这是有道理的,因为属性查找顺序是:
- 数据描述符
-
instance_obj.__dict__中的实例属性 - 非数据描述符
由于属性实际上只是实现描述符,我想知道为什么这种属性查找顺序似乎没有得到尊重。请参阅以下内容:
class MyClass(object):
def __init__(self, fname, lname):
self._fname = fname
self._lname = lname
@property
def fullname(self):
return '{} {}'.format(self._fname, self._lname)
mc = MyClass('Bob', 'John')
print(mc.fullname)
mc.__dict__['fullname'] = 'testing'
print(mc.__dict__)
print(mc.fullname)
输出是:
Bob John
{'_fname': 'Bob', '_lname': 'John', 'fullname': 'testing'}
Bob John
我期待,因为属性对象 fullname 实际上只是一个非数据描述符,实例属性 fullname 将优先。
此外,函数也被实现为非数据描述符,并且遵循此属性查找顺序:
class Test:
def __init__(self):
self.display = 'display instance attribute'
def display(self):
print('display from instance method')
t = Test()
print(t.display)
输出是:
display instance attribute
谁能解释为什么它与属性对象不同?
【问题讨论】:
标签: python python-3.x function properties