我有一个这样的课:
class Foo(object):
def __init__(self):
self.bar = property(self.get_bar)
def get_bar(self):
return "bar"
print Foo().bar #this prints <property object at 0x0051CB40>
Run Code Online (Sandbox Code Playgroud)
我已经看过Python属性如何工作?,如何在__init__中设置python属性,但它们都使用装饰器方法,我没有,因为我想要一个不同的名称.我需要访问self
我如何让财产表现出来?
该对象未实例化。
class Foo(object):
def get_bar(self):
return "bar"
bar = Foo()
print(bar.get_bar)
Run Code Online (Sandbox Code Playgroud)
你需要做一个小改动:
class Foo(object):
def get_bar(self):
return "bar"
bar = property(get_bar)
print Foo().bar # prints bar
Run Code Online (Sandbox Code Playgroud)
属性需要是类的属性,而不是实例; 这就是描述符协议的工作原理.
您也可以按照此处所示进行操作:
class Foo(object):
def __init__(self):
self._bar = None
@property
def bar(self):
return self._bar
@bar.setter
def bar(self, value):
self._bar = value
@bar.deleter
def bar(self):
self._bar = None # for instance
Run Code Online (Sandbox Code Playgroud)
这相当于:
class Also_Foo(object):
def __init__(self):
self._bar = None
def get_bar(self):
return self._bar
def set_bar(self, value):
self._bar = value
def del_bar(self):
self._bar = None # for instance
bar = property(fget=get_bar, fset=set_bar, fdel=del_bar, doc=None)
Run Code Online (Sandbox Code Playgroud)
但get不会用每个属性的方法污染类名称空间set。
._bar您可以使用而不是保留对变量的外部直接访问.bar。
你可以这样做
class Foo(object):
def __init__(self):
self.__bar = None
def get_bar(self):
return self.__bar
def set_bar(self, value):
self.__bar = value
bar = property(get_bar, set_bar)
foo = Foo()
print foo.bar # None
foo.bar = 1
print foo.bar # 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14323 次 |
| 最近记录: |