首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python属性引用成员属性的属性/属性?

python属性引用成员属性的属性/属性?
EN

Stack Overflow用户
提问于 2018-07-18 07:34:35
回答 2查看 260关注 0票数 0

我在想我是否有:

代码语言:javascript
复制
class A(object):
    def __init__(self):
        self.attribute = 1
        self._member = 2
    def _get_member(self):
        return self._member
    def _set_member(self, member):
        self._member = member
    member = property(_get_member, _set_member)

class B(object):
    def __init__(self):
        self._member = A()
    def _get_a_member(self):
        return self._member.member
    def _set_a_member(self, member):
        self._member.member = member
    member = property(_get_a_member, _set_a_member)

我是否可以避免为A.member编写get/setter,而只引用A对象的属性或属性?

在get/setter执行逻辑的地方,它当然是必需的,但是如果我只是不公开一个成员属性的成员/属性,那么编写get/setter就像是开销。

我想,即使我可以在行内写get/setter,也会有帮助吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-07-18 09:03:34

我觉得这个问题有点不清楚,但我试图解释一些背景。

在get/setter执行逻辑的地方,当然需要它,但如果我只是不公开成员属性的成员/属性

如果getter/getter中没有逻辑,那么就不需要将属性定义为property,但是属性可以直接使用(在任何上下文中)。

所以

代码语言:javascript
复制
class A(object):
    def __init__(self):
        self.attribute = 1
        self.member = 2

class B(object):
    def __init__(self):
        self.member = A()

B().member.member  # returns 2
B().member.member = 10

在某些语言中,使用getter/setter方法抽象实例属性被认为是很好的做法,在Python中不一定如此。当您需要对属性进行更多的控制时,Python属性非常有用,例如:

  • 当有逻辑(验证等)时
  • 定义只读属性(因此只提供没有setter的getter )

更新(注释后)

属性不一定是“隐藏”某些内部实现的工具。由于Python语言的动态特性,在Python中隐藏与在Java中隐藏有一点不同。随时可以对对象进行内省,甚至动态更改对象,您可以在运行时向对象添加新的属性(偶数方法):

代码语言:javascript
复制
b = B()
b.foo = 4  # define a new attribute on runtime
b.foo  # returns 4

因此,Python开发人员更多地依赖于公约来暗示他们的抽象意图。

关于多态成员,我认为Python类只共享一个接口是最自然的,这就是鸭型的意思。因此,只要您的下一个A实现支持相同的接口(为调用方提供相同的方法),更改其实现就不会有任何问题。

票数 2
EN

Stack Overflow用户

发布于 2018-07-18 08:55:42

这就是我想出的--使用一种方法来生成属性,假设obj有一个属性_member:

代码语言:javascript
复制
def generate_cls_a_property(name):
    """Small helper method for generating a 'dumb' property for the A object"""
    def getter(obj):
        return getattr(obj._member, name)

    def setter(obj, new_value):
        setattr(obj._member, name, new_value)

    return property(getter, setter)

这允许我添加如下的属性:

代码语言:javascript
复制
class B(object):
    def __init__(self):
        self._member = A()
    member = generate_cls_a_property('member')  # generates a dumb/pass-through property

我会接受我自己的,除非在一周内有人超过它。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51396167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档