我有一个这样的课程:
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>
我见过How do Python properties work?,How to set a python property in __init__,但他们都使用装饰器方法,我没有,因为我想要一个不同的名字。我需要访问self
我如何让财产表现出来?
答案 0 :(得分:6)
你需要做一个小改动:
class Foo(object):
def get_bar(self):
return "bar"
bar = property(get_bar)
print Foo().bar # prints bar
属性需要是类的属性,而不是实例;这就是descriptor协议的工作原理。
答案 1 :(得分:5)
你可以这样做
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
答案 2 :(得分:2)
你也可以像显示here:
那样做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
相当于:
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)
但,不会使用get
和set
方法为每个属性污染类命名空间。
您可以使用._bar
代替.bar
保留对变量的外部直接访问权限。
答案 3 :(得分:0)
我的用例要求仅在某些条件下将 bar
定义为属性,因此我采纳了 jonrsharpe 的建议并将定义移至 __new__
:
class Foo(object):
def __new__(cls):
cls.bar = property(cls.get_bar)
return super(Foo, cls).__new__(cls)
def get_bar(self):
return "bar"
print(Foo().bar) #this prints "bar"
然而,这种“聪明”并没有得到任何好处。一旦满足条件,该类就包含该属性。我也可以像 jonrsharpe 那样定义它。
答案 4 :(得分:-2)
对象未实例化。
var names = ['Bryan', 'Jeremy', 'Joe', 'Megan', 'Ian', 'Taylor'],
first = names.find(_ => true);
console.log(first);