Python属性:为什么这段代码不运行该函数?

时间:2014-11-10 14:06:14

标签: python class properties

我正在尝试使用属性,我尝试更改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

2 个答案:

答案 0 :(得分:2)

您的财产无法运作有两个原因:

  1. 您需要使用new style class(将您的课程设在object上);你不能使用带有setter的属性(旧式类只支持getter)。

  2. 您将生成访问器作为嵌套函数;你需要调用那些外部方法来生成那些访问器,property()函数不会为你做这个。因此,您可以移动类的 out ,并将它们用作普通函数。

  3. 以下代码有效:

    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。你想要实现的是什么?