加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

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

发布时间:2020-12-16 23:02:11 所属栏目:Python 来源:网络整理
导读:我是 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 chil
我是 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?

解决方法

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

您可以使用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>>

函数.__ get __()的返回值,当给定实例和类时,是绑定方法.调用该方法将调用与实例自绑定的底层函数.

说到描述符,property() function也返回一个描述符,使得函数的行为类似于属性;他们可以截取该属性的getattr(),setattr()和delattr()操作并将其转换为函数调用:

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

访问.bar调用了bar属性get hook,然后调用原始bar方法.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读