我在想我是否有:
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,也会有帮助吗?
发布于 2018-07-18 09:03:34
我觉得这个问题有点不清楚,但我试图解释一些背景。
在get/setter执行逻辑的地方,当然需要它,但如果我只是不公开成员属性的成员/属性
如果getter/getter中没有逻辑,那么就不需要将属性定义为property,但是属性可以直接使用(在任何上下文中)。
所以
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属性非常有用,例如:
更新(注释后)
属性不一定是“隐藏”某些内部实现的工具。由于Python语言的动态特性,在Python中隐藏与在Java中隐藏有一点不同。随时可以对对象进行内省,甚至动态更改对象,您可以在运行时向对象添加新的属性(偶数方法):
b = B()
b.foo = 4 # define a new attribute on runtime
b.foo # returns 4因此,Python开发人员更多地依赖于公约来暗示他们的抽象意图。
关于多态成员,我认为Python类只共享一个接口是最自然的,这就是鸭型的意思。因此,只要您的下一个A实现支持相同的接口(为调用方提供相同的方法),更改其实现就不会有任何问题。
发布于 2018-07-18 08:55:42
这就是我想出的--使用一种方法来生成属性,假设obj有一个属性_member:
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)这允许我添加如下的属性:
class B(object):
def __init__(self):
self._member = A()
member = generate_cls_a_property('member') # generates a dumb/pass-through property我会接受我自己的,除非在一周内有人超过它。:)
https://stackoverflow.com/questions/51396167
复制相似问题