我知道属性getter和setter被认为是" unpythonic",pythonic做事的方法是简单地使用普通属性并使用属性装饰器如果以后需要触发访问或设置属性时的一些功能。
e.g。 What's the pythonic way to use getters and setters?
但是,当属性的值是列表时,这是如何应用的,例如?
class AnimalShelter(object):
def __init__(self):
dogs = []
cats = []
class Cat(object):
pass
class Dog(object):
pass
首先说,界面的工作原理如下:
# Create a new animal shelter
woodgreen = AnimalShelter()
# Add some animals to the shelter
dog1 = Dog()
woodgreen.dogs.append(dog1)
这似乎符合" pythonic"只使用直接属性而不是创建getter,setter,mutators等的想法。我本可以创建一个addDog
方法。但是,虽然严格来说不是一个setter(因为它改变了属性的值而不是设置属性),但与我上面的解决方案相比,它似乎仍然像setter一样。
但是,后来说,当你添加狗时,你需要触发一些功能。你不能回到使用属性装饰器,因为添加一个狗不是在对象上设置属性,而是检索一个列表,该列表是该属性的值,并改变该列表。
什么是" pythonic"处理这种情况的方式?
答案 0 :(得分:1)
什么是unpythonic 无用的 getter和setter - 因为Python对计算属性有很强的支持。这并不意味着您不应该正确封装您的实施。
在您的上述例子中,AnimalShelter
班级处理它的方式"拥有"动物是一个实现细节,不应该暴露,因此使用受保护的属性并暴露一组相关的公共方法/属性是完全pythonic:
class AnimalShelter(object):
def __init__(self):
self._dogs = []
self._cats = []
def add_dog(self, dog):
if dog not in self._dogs:
self._dogs.append(dog)
def get_dogs(self):
return self._dogs[:] # return a shallow copy
# etc