我了解使用属性的主要目的之一是进行验证和格式化。例如,我有一个如下所示的User类。我希望在设置名字和姓氏时将其大写。如果可以编写以下代码来实现相同的格式设置结果,为什么需要属性?
class User:
def __init__(self, firstname, lastname):
self.firstname = firstname
self.lastname = lastname
def __setattr__(self, attr, value):
if attr == 'firstname':
self.__dict__[attr] = value.capitalize()
elif attr == 'lastname':
self.__dict__[attr] = value.capitalize()
没错,您不需要属性就可以在设置属性时执行验证,也不需要在执行属性查找时执行特殊行为。但是属性更易读,更易于编写。我会坚持使用__getattr__
,并__setattr__
在你需要动态访问属性(也就是,你不知道什么属性,你就必须在类定义的时间)的情况。否则,请使用属性,因为它们是非常容易识别的python习惯用法。
实际上,在这种情况下,如果您有两个执行相同验证的属性,则可以使用描述符:
class NameDescriptor(object):
def __init__(self, key):
self.key = key
def __get__(self, obj, objtype):
return getattr(obj, self.key)
def __set__(self, obj, val):
setattr(obj, self.key, val.capitalize())
class User(object):
firstname = NameDescriptor('_firstname')
lastname = NameDescriptor('_lastname')
def __init__(self, first, last):
self.firstname = first
self.lastname = last
演示如何工作的:
>>> user = User('steve', 'martin')
>>> user.firstname
'Steve'
>>> user.firstname = 'dean'
>>> user.firstname
'Dean'
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句