【问题标题】:How should I handle Python list properties with respect to getters/setters?我应该如何处理与 getter/setter 相关的 Python 列表属性?
【发布时间】:2014-05-18 16:41:30
【问题描述】:

据我了解,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 会收到通知他们已被通知的功能添加到mefriends 列表中。

【问题讨论】:

  • 你不能“拦截”me.friends.append(you)Person.friends 是一个普通的list,但你可以提供一个方法:def append_friend(self, friend):
  • @jonrsharpe 我认为您的“香草列表”参考可能让我意识到我需要创建一个额外的课程,所以感谢您为我的想法提供种子。

标签: python list python-3.x properties


【解决方案1】:

当然,一旦我提出这个问题,我的大脑就会启动并想出一个解决方案。让我知道这是否好。不要拦截Person 中的.append() 调用,而是创建一个类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)

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 2017-10-09
    • 2016-02-11
    • 2014-07-04
    • 1970-01-01
    • 2016-05-03
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多