为了账号安全,请及时绑定邮箱和手机立即绑定

Python属性如何工作?

Python属性如何工作?

慕姐4208626 2019-10-26 13:06:45
我已经成功使用了Python属性,但看不到它们如何工作。如果我取消引用类之外的属性,我只会得到一个类型的对象property:@propertydef hello(): return "Hello, world!"hello  # <property object at 0x9870a8>但是,如果我将一个属性放在一个类中,则行为会非常不同:class Foo(object):   @property   def hello(self): return "Hello, world!"Foo().hello # 'Hello, world!'我注意到未绑定Foo.hello仍然是property对象,因此类实例化必须在做魔术,但这是什么魔术?
查看完整描述

3 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

正如其他人指出的那样,它们使用称为描述符的语言功能。


当您通过类访问实际属性对象时,返回该属性对象的原因在于该属性Foo.hello如何实现__get__(self, instance, owner)特殊方法:


如果在实例上访问了描述符,则该实例作为适当的参数传递,并且owner是该实例的类。

当通过类访问它时,instance则为None且仅owner通过。该property对象认识到这一点并返回self。

除了“ 描述符”方法外,另请参阅《语言指南》中有关实现描述符和调用描述符的文档。


查看完整回答
反对 回复 2019-10-26
?
交互式爱情

TA贡献1712条经验 获得超3个赞

为了使@properties正常工作,该类必须是object的子类。当该类不是对象的子类时,则首次尝试访问setter时,它实际上会创建一个名称较短的新属性,而不是通过setter进行访问。


以下无法正常工作。


class C(): # <-- Notice that object is missing


    def __init__(self):

        self._x = None


    @property

    def x(self):

        print 'getting value of x'

        return self._x


    @x.setter

    def x(self, x):

        print 'setting value of x'

        self._x = x


>>> c = C()

>>> c.x = 1

>>> print c.x, c._x

1 0

以下将正常工作


class C(object):


    def __init__(self):

        self._x = None


    @property

    def x(self):

        print 'getting value of x'

        return self._x


    @x.setter

    def x(self, x):

        print 'setting value of x'

        self._x = x


>>> c = C()

>>> c.x = 1

setting value of x

>>> print c.x, c._x

getting value of x

1 1


查看完整回答
反对 回复 2019-10-26
  • 3 回答
  • 0 关注
  • 335 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信