调用方法和访问属性之间的区别

时间:2013-06-08 14:23:35

标签: python oop

我是Python的新手,我正在使用Python 3.3.1。

class Parent: # define parent class 
    parentAttr = 100
    age = 55

    def __init__(self): 
        print ("Calling parent constructor") 

    def setAttr(self, attr): 
        Parent.parentAttr = attr 

class Child(Parent):
    def childMethod(self):
        print ('Calling child method')

现在我要创建

c=child
c.[here every thing will appear methods and attr (age,setAttr)]

如何区分方法和属性?我的意思是,我何时使用c.SetAtrr(Argument)c.SetAtrr=value

1 个答案:

答案 0 :(得分:11)

方法也是属性。它们恰好是可调用的对象。

您可以使用callable() function

检测对象是否可调用
>>> def foo(): pass
...
>>> callable(foo)
True
>>> callable(1)
False

调用方法时,查找属性(getattr()操作),然后调用结果:

c.setAttr(newvalue)

是两个步骤;找到属性(在这种情况下查找类上的属性,并将其视为描述符),然后调用结果对象,即方法。

当您分配属性时,您将该名称重新绑定为新值:

c.setAttr = 'something else'

将是setattr()操作。

如果您想截取获取和设置课程实例的属性,可以提供attribute access hooks__getattr____setattr____delattr__

如果要将方法添加到实例,则必须将该函数视为descriptor object,它会生成方法对象:

>>> class Foo: pass
... 
>>> foo = Foo()  # instance
>>> def bar(self): pass
... 
>>> bar
<function bar at 0x10b85a320>
>>> bar.__get__(foo, Foo)
<bound method Foo.bar of <__main__.Foo instance at 0x10b85b830>>

当给定实例和类时,function.__get__()的返回值是绑定方法。调用该方法将调用绑定到实例的self的基础函数。

说到描述符,property() function也返回一个描述符,使得表现的函数成为可能;他们可以拦截该属性的getattr()setattr()delattr()操作,并将其转换为函数调用:

>>> class Foo:
...     @property
...     def bar(self):
...         return "Hello World!"
... 
>>> foo = Foo()
>>> foo.bar
"Hello World!"

访问.bar会调用bar属性获取挂钩,然后调用原始bar方法。

在几乎所有情况下,您都不需要callable()功能;您记录您的API,并提供方法和属性,API的用户将在不测试每个属性的情况下找出它以查看它是否可调用。使用属性,您可以灵活地提供在任何情况下都是真正可调用的属性。