问题是指在哪个用例中最好使用哪一个,而不是技术背景。
在 python 中,您可以通过属性、描述符或魔术方法来控制属性的访问。在哪个用例中哪一个是最 Pythonic 的?它们似乎都具有相同的效果(请参见下面的示例)。
我正在寻找类似的答案:
- 属性:应该在……的情况下使用。</li>
- Descriptor:在……的情况下,应该使用它而不是属性。
- 魔术方法:仅在……时使用。
例子
用例是可能无法在__init__
方法中设置的属性,例如,因为该对象尚未出现在数据库中,但稍后会出现。每次访问该属性时,都应尝试设置并返回。
作为在 Python shell 中使用 Copy&Paste 的示例,有一个类希望仅在第二次被要求时才显示其属性。那么,哪一种是最好的方法,或者有不同的情况,其中一种更可取?以下是实现它的三种方法:
拥有财产::
class ContactBook(object):
intents = 0
def __init__(self):
self.__first_person = None
def get_first_person(self):
ContactBook.intents += 1
if self.__first_person is None:
if ContactBook.intents > 1:
value = 'Mr. First'
self.__first_person = value
else:
return None
return self.__first_person
def set_first_person(self, value):
self.__first_person = value
first_person = property(get_first_person, set_first_person)
与__getattribute__
::
class ContactBook(object):
intents = 0
def __init__(self):
self.first_person = None
def __getattribute__(self, name):
if name == 'first_person' \
and object.__getattribute__(self, name) is None:
ContactBook.intents += 1
if ContactBook.intents > 1:
value = 'Mr. First'
self.first_person = value
else:
value = None
else:
value = object.__getattribute__(self, name)
return value
描述符::
class FirstPerson(object):
def __init__(self, value=None):
self.value = None
def __get__(self, instance, owner):
if self.value is None:
ContactBook.intents += 1
if ContactBook.intents > 1:
self.value = 'Mr. First'
else:
return None
return self.value
class ContactBook(object):
intents = 0
first_person = FirstPerson()
每一个都有这种行为::
book = ContactBook()
print(book.first_person)
# >>None
print(book.first_person)
# >>Mr. First