我正在尝试使用属性,我尝试更改python文档的code。我希望以下内容可以打印任何内容,但事实并非如此。 为什么不打印?
class User:
def getter(self, name):
def get_prop(self):
print 'Getting {}'.format(name)
return getattr(self, name)
return get_prop
def setter(self, name):
def set_prop(self, value):
print 'Setting {} to {}'.format(name, value)
return setattr(self, name, value)
return set_prop
user_id = property(getter, setter)
u = User()
u.user_id = 10
u.user_id
答案 0 :(得分:2)
您的财产无法运作有两个原因:
您需要使用new style class(将您的课程设在object
上);你不能使用带有setter的属性(旧式类只支持getter)。
您将生成访问器作为嵌套函数;你需要调用那些外部方法来生成那些访问器,property()
函数不会为你做这个。因此,您可以移动类的 out ,并将它们用作普通函数。
以下代码有效:
def getter(name):
def get_prop(self):
print 'Getting {}'.format(name)
return getattr(self, name)
return get_prop
def setter(name):
def set_prop(self, value):
print 'Setting {} to {}'.format(name, value)
return setattr(self, name, value)
return set_prop
class User(object):
user_id = property(getter('_user_id'), setter('_user_id'))
请注意,我使用_user_id
作为属性' name'在这里,否则getattr(self, name)
调用将触发无限递归; u.user_id
会触发getattr(u, 'user_id')
,再次触发该属性。
答案 1 :(得分:1)
可能因为属性仅适用于新式对象。将您的class
声明更改为:
class User(object):
进一步看,你的getter和setter函数正在返回函数,然后你就不用了。
您似乎想要动态属性名称,但您只有property
返回的一个属性名称,在您的情况下,这是user_id
。你想要实现的是什么?