我应该如何处理关于getter / setter的Python列表属性?

时间:2014-04-06 14:37:26

标签: python list python-3.x properties

我的理解是,Pythonic方法的一个方面是使用类的直接成员变量访问,直到需要'getters / setters'。代码可在Ideone

上找到
class Person():
    def __init__(self, name, age=None, friends=None):
        self.name = name
        self.age = age
        if friends is None:
            self.friends = []
        else:
            self.friends = friends

me = Person('Mr. Me')
you = Person('Ms. You')

me.age = 42
me.friends.append(you)

由于@property装饰器方法,将来可以将对成员变量age的访问“转换”为“getter / setter”接口,而无需重写将其设置为42的行。但是我在you列表中添加friends的最后一行? Person课程是否有可能拦截append()来电并采取其他行动?也许在将来我会决定添加you会有的功能收到通知他们已被添加到me的{​​{1}}列表。

1 个答案:

答案 0 :(得分:1)

当然,一旦我提出问题,我的大脑就会开启并提出解决方案。如果这是好的,请告诉我。不要拦截.append()中的Person来电,而是创建一个类PersonFriendList(List)并覆盖具有所需功能的append()。然后,而不是将[]分配给self.friends分配PersonFriendList().friend值可能也应该被装饰为@property,以便Person拦截分配,以避免.friend被写入错误的列表。

Ideone上提供的代码。

class Person():
    def __init__(self, name, age=None, friends=None):
        self.name = name
        self.age = age
        if friends is None:
            friends = []
        self.friends = PersonFriendList(friends)


class PersonFriendList(list):
    def __init__(self, *args):
        super(PersonFriendList, self).__init__(*args)
        self.DebugPrint('constructed with {}'.format(str(*args)))

    def DebugPrint(self, string):
        print('{}(): {}'.format(self.__class__.__name__, string))

    def append(self, *args):
        super(PersonFriendList, self).append(*args)
        self.DebugPrint('appending {}'.format(str(*args)))

me = Person('Mr. Me')
you = Person('Ms. You')

me.age = 42
me.friends.append(you)
相关问题