摘要:与通常认为实例方法是的,而类方法是的,这种说法也没错,只是对于不同类型变量来说,结果是不同的测试一下结果显示的都是直接从类访问,结果这个实例方法显示的是。可以知道的意义并不是始终不变的,对于不同的对象来说意义并不一样。
bound与unbound
通常认为实例方法是bound的,而类方法是unbound的,这种说法也没错,只是对于不同类型变量来说,结果是不同的
class A(object): """test class""" _instance = None def __private(self): pass def _protect(self): pass def fs(self): pass @staticmethod def sm(): pass @classmethod def fc(cls): pass
测试一下, 结果显示的都是bound method
>>> a = A() >>> a.fs> >>> a.fc >
直接从类访问,结果fs这个实例方法显示的是unbound。可以知道bound的意义并不是始终不变的,对于不同的对象来说意义并不一样。
>>> A.fs>>> A.fc >
python里面类方法和实例方法可以等价变换
a.fs() # equals A.fs(a)
从描述器的角度看
>>> A.__dict__["fs"].__get__(None, A)>>> A.__dict__["fs"].__get__(a, A) > >>> A.__dict__["fc"].__get__(None, A) >
不过实例a调用静态方法会出错(TypeError),因为实例对方法的调用提供了self参数,但sm是没有参数的。但是这提供了另一种思路)比如在python的多进程编程中,进程跑的函数如果是实例函数的会因为无法序列化而失败,但如果是staticmethod就没有问题,静态函数的本质其实也就是普通函数。
所以可以这样
class B(object): @staticmethod def run(inst): inst.foo() def foo(self): print "foo" b = B() B.run(b)
在2.x中区分实例函数和类函数可以用im_self
>>> A.fs.im_self None >>> A.fc.im_self
至于通过实例引用方法时的im_self的值,大家自己可以探索下
获取类中所有定义的方法使用dir函数
>>> dir(A) ["_A__private", "__class__", "__delattr__", "__dict__", "__doc__", "__format__", "__getattribute__", "__hash__", "__init__", "__module__", "__new__", "__reduce__", "__reduce_ex__", "__repr__", "__setattr__", "__sizeof__", "__str__", "__subclasshook__", "__weakref__", "_instance", "_protect", "fc", "fs", "sm"]
2 使用inspect.getmembers
这个除了函数名的字符串以外,连对象的type也得到了,结果更加详细
>>> inspect.getmembers(A) [("_A__private",判断某个属性是否可调用), ("__class__", type), ("__delattr__", ), ("__dict__", , "__dict__": , "__doc__": "test class", "__module__": "__main__", "__weakref__": , "_instance": None, "_protect": , "fc": , "fs": , "sm": }>), ("__doc__", "test class"), ("__format__", ), ("__getattribute__", ), ("__hash__", ), ("__init__", ), ("__module__", "__main__"), ("__new__", ), ("__reduce__", ), ("__reduce_ex__", ), ("__repr__", ), ("__setattr__", ), ("__sizeof__", ), ("__str__", ), ("__subclasshook__", ), ("__weakref__", ), ("_instance", None), ("_protect", ), ("fc", >), ("fs", ), ("sm", )]
a = A() callable(getattr(a, "testattr", None))
获得一个对象中所有可调用的方法
[method for method in dir(object) if callable(getattr(object, method))]隐藏属性
重写__dict__或者__dir__
class C(object): __dict__ = {} def __dir__(self): return ["cherry"]
注意,这里的__dict__不是类的,是实例的,类的__dict__是不可写的,不信可以试试
__dir__很奇怪,如果dir函数用在C的实例上,确实会返回["cherry"],但dir(C)还是能得到类中所有属性,有点掩耳盗铃的感觉,待继续研究
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/45409.html
摘要:尽管和非常相似,但在用法上依然有一些明显的区别。所以,从静态方法的使用中可以看出,我们不会访问到本身它基本上只是一个函数,在语法上就像一个方法一样,但是没有访问对象和它的内部字段和其他方法,相反会访问,会访问。 python staticmethod and classmethod Though classmethod and staticmethod are quite simil...
摘要:本篇主要总结中绑定方法对象和未绑定方法对象的区别和联系。在中使用描述器有翻译的链接来表示具有绑定行为的对象属性,使用描述器协议方法来控制对具有绑定行为属性的访问,这些描述器协议方法包括和。其中通过限定的必须使用实例才能调用。 本篇主要总结Python中绑定方法对象(Bound method object)和未绑定方法对象(Unboud method object)的区别和联系。主要目的...
摘要:在类的成员函数中访问实例属性需要以为前缀。但提供一种对私有成员的访问方式对象名类名私有成员类中保护对象类中系统定义的特殊成员类中私有成员多态列表项目 Python学习第一天 类与对象 python的成员函数在,默认有一个self参数,这是类的成员函数与普通函数的主要区别,self,位于参数列表的开头,self也代表类的实例(对象)自身,可以使用self引用类中的属性和成员函数。在...
摘要:原链接中的元类是什么类也是对象在理解元类之前,需要掌握中类概念。事实上,是中用于创建所有类的元类。类本身是元类的对象在中,除了,一切皆对象,一切都是类或者元类的对象。事实上是自己的元类, 学习契机 项目中使用Elasticsearch(ES)存储海量业务数据,基于ES向外提供的API进一层封装,按需处理原始数据提供更精确、更多样化的结果。在研究这一层的代码时接触到@six.add_me...
摘要:在对象接口后包装其实现的细节,从而隔离了代码的修改对用户产生的影响。类提供了一个新的本地作用域,最小化了变量名冲突。类其实并没有结束,不过本讲座到此对类暂告一段。 前面对类的有关内容已经描述不少了,其实话题远远没有结束,不过对于初学者,掌握这些已经算是入门,在以后的实践中,还需要进行体会和感悟。 这几天和几个朋友以各种途径讨论过OOP的相关问题,他们是:令狐虫、Frank、晋剑、小冯...
阅读 1494·2021-09-30 09:47
阅读 3486·2021-09-22 15:05
阅读 2804·2021-08-30 09:44
阅读 3597·2019-08-30 15:55
阅读 1346·2019-08-30 13:08
阅读 1307·2019-08-29 16:40
阅读 514·2019-08-29 12:45
阅读 1327·2019-08-29 11:25