def __getattr(self,attr) :#attr是self的一个属性名 pass;先来阐述下什么叫数据描述符。 数据描述符是指实现了__get__,__set__,__del__方法的类属性(由于Python中,一切皆是对象,所以你不妨把所有的属性也看成是对象) PS:个人觉得这里最好把数据描述符等效于定义了__get__,__set__,__del__三个方法的接口。
type(x).__dict__['foo'].__get__(x,type(x))
type(x).__dict__['foo'].__get__(None,type(x))
class A(object): foo=1.3; print str(A.__dict__);
{'__dict__': <attribute '__dict__' of 'A' objects>, '__module__': '__main__',
'foo': 1.3, '__weakref__': <attribute '__weakref__' of 'A' objects>, '__doc__': None}
class A(object): foo=1.3; a=A(); print a.foo; a.foo=15; print a.foo;
class A(object): foo=1.3; a=A(); print a.foo; a.foo=15; print a.foo; del a.foo; print a.foo;
class PythonSite(object): webframework = WebFramework() version = 0.01 def __init__(self, site): self.site = site
In [1]: pysite = PythonSite('ghost')
In [2]: vars(PythonSite).items()
Out[2]:
[('__module__', '__main__'),
('version', 0.01),
('__dict__', <attribute '__dict__' of 'PythonSite' objects>),
('webframework', <__main__.WebFramework at 0x10d55be90>),
('__weakref__', <attribute '__weakref__' of 'PythonSite' objects>),
('__doc__', None),
('__init__', <function __main__.__init__>)]
In [3]: vars(pysite)
Out[3]: {'site': 'ghost'}
In [4]: PythonSite.__dict__
Out[4]:
<dictproxy {'__dict__': <attribute '__dict__' of 'PythonSite' objects>,
'__doc__': None,
'__init__': <function __main__.__init__>,
'__module__': '__main__',
'__weakref__': <attribute '__weakref__' of 'PythonSite' objects>,
'version': 0.01,
'webframework': <__main__.WebFramework at 0x10d55be90>}>
In [6]: pysite1 = PythonSite('ghost')
In [7]: pysite2 = PythonSite('admin')
In [8]: PythonSite.version
Out[8]: 0.01
In [9]: pysite1.version
Out[9]: 0.01
In [10]: pysite2.version
Out[10]: 0.01
In [11]: pysite1.version is pysite2.version
Out[11]: True
In [12]: pysite1.version = 'pysite1'
In [13]: vars(pysite1)
Out[13]: {'site': 'ghost', 'version': 'pysite1'}
In [14]: vars(pysite2)
Out[14]: {'site': 'admin'}
In [15]: PythonSite.version = 0.02
In [16]: pysite1.version
Out[16]: 'pysite1'
In [17]: pysite2.version
Out[17]: 0.02
In [21]: pysite1.site Out[21]: 'ghost' In [22]: pysite1.__dict__['site'] Out[22]: 'ghost' In [23]: pysite2.version Out[23]: 0.02 In [24]: pysite2.__dict__['version'] --------------------------------------------------------------------------- KeyError Traceback (most recent call last) <ipython-input-24-73ef6aeba259> in <module>() ----> 1 pysite2.__dict__['version'] KeyError: 'version' In [25]: type(pysite2).__dict__['version'] Out[25]: 0.02 In [32]: type(pysite1).__dict__['webframework'] Out[32]: <__main__.WebFramework at 0x103426e90> In [38]: type(pysite1).__dict__['webframework'].__get__(None, PythonSite) Out[38]: 'Flask'
class PythonSite(object): webframework = WebFramework() version = 0.01 def __init__(self, site): self.site = site def get_site(self): return self.site @classmethod def get_version(cls): return cls.version @staticmethod def find_version(): return PythonSite.version
In [1]: ps = PythonSite('ghost')
In [2]: ps.get_version
Out[2]: <bound method type.get_version of <class '__main__.PythonSite'>>
In [3]: ps.get_version()
Out[3]: 0.01
In [4]: PythonSite.get_version
Out[4]: <bound method type.get_version of <class '__main__.PythonSite'>>
In [5]: PythonSite.get_version()
Out[5]: 0.01
In [6]: vars(ps)
Out[6]: {'site': 'ghost'}
In [7]: type(ps).__dict__['get_version']
Out[7]: <classmethod at 0x108952e18>
In [8]: type(ps).__dict__['get_version'].__get__(ps, type(ps))
Out[8]: <bound method type.get_version of <class '__main__.PythonSite'>>
In [9]: type(ps).__dict__['get_version'].__get__(ps, type(ps)) == ps.get_version
Out[9]: True
In [10]: PythonSite.__dict__['get_version'] Out[10]: <classmethod at 0x108952e18> In [11]: PythonSite.__dict__['get_version'].__get__(None, PythonSite) Out[11]: <bound method type.get_version of <class '__main__.PythonSite'>> In [12]: PythonSite.__dict__['get_version'].__get__(None, PythonSite) == PythonSite.get_version Out[12]: True
In [13]: ps.find_version
Out[13]: <function __main__.find_version>
In [14]: ps.find_version()
Out[14]: 0.01
In [15]: vars(ps)
Out[15]: {'site': 'ghost'}
In [16]: type(ps).__dict__['find_version']
Out[16]: <staticmethod at 0x108952d70>
In [17]: type(ps).__dict__['find_version'].__get__(ps, type(ps))
Out[17]: <function __main__.find_version>
In [18]: type(ps).__dict__['find_version'].__get__(ps, type(ps)) == ps.find_version
Out[18]: True
In [19]: PythonSite.find_version()
Out[19]: 0.01
In [20]: PythonSite.find_version
Out[20]: <function __main__.find_version>
In [21]: type(ps).__dict__['find_version'].__get__(None, type(ps))
Out[21]: <function __main__.find_version>
In [22]: type(ps).__dict__['find_version'].__get__(None, type(ps)) == PythonSite.find_version
Out[22]: True
In [2]: ps.get_site Out[2]: <bound method PythonSite.get_site of <__main__.PythonSite object at 0x1054ae2d0>> In [3]: ps.get_site() Out[3]: 'ghost' In [4]: type(ps).__dict__['get_site'] Out[4]: <function __main__.get_site> In [5]: type(ps).__dict__['get_site'].__get__(ps, type(ps)) Out[5]: <bound method PythonSite.get_site of <__main__.PythonSite object at 0x1054ae2d0>> In [6]: type(ps).__dict__['get_site'].__get__(ps, type(ps)) == ps.get_site Out[6]: True
In [7]: PythonSite.get_site Out[7]: <unbound method PythonSite.get_site> In [8]: PythonSite.get_site() --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-8-99c7d7607137> in <module>() ----> 1 PythonSite.get_site() TypeError: unbound method get_site() must be called with PythonSite instance as first argument (got nothing instead) In [9]: PythonSite.get_site(ps) Out[9]: 'ghost' In [10]: PythonSite.__dict__['get_site'] Out[10]: <function __main__.get_site> In [11]: PythonSite.__dict__['get_site'].__get__(None, PythonSite) Out[11]: <unbound method PythonSite.get_site> In [12]: PythonSite.__dict__['get_site'].__get__(None, PythonSite) == PythonSite.get_site Out[12]: True In [14]: PythonSite.__dict__['get_site'].__get__(ps, PythonSite) Out[14]: <bound method PythonSite.get_site of <__main__.PythonSite object at 0x1054ae2d0>> In [15]: PythonSite.__dict__['get_site'].__get__(ps, PythonSite)() Out[15]: 'ghost'
class simpleDescriptor(object): def __get__(self,obj,type=None) : pass; def __set__(self,obj,val): pass; def __del__(self,obj): pass class A(object): foo=simpleDescriptor(); print str(A.__dict__); print A.foo; a=A(); print a.foo; a.foo=13; print a.foo;
{'__dict__': <attribute '__dict__' of 'A' objects>, '__module__': '__main__',
'foo': <__main__.simpleDescriptor object at 0x00C46930>,
'__weakref__': <attribute '__weakref__' of 'A' objects>,
'__doc__': None}
None
None
None
class simpleDescriptor(object): def __init__(self): self.result=None; def __get__(self,obj,type=None) : return self.result-10; def __set__(self,obj,val): self.result=val+3; print self.result; def __del__(self,obj): pass class A(object): foo=simpleDescriptor(); a=A(); a.foo=13; print a.foo;
16 6
class B(object): foo=1.3; b=B(); print b.__dict__ #print b.bar; b.bar=13; print b.__dict__ print b.bar;
{}
{'bar': 13}
13
def hello(): pass print dir(hello)
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name']
class simpleDescriptor(object): def __get__(self,obj,type=None) : return 'get',self,obj,type; class D(object): foo=simpleDescriptor(); d=D(); print d.foo; d.foo=15; print d.foo;
('get', <__main__.simpleDescriptor object at 0x00C46870>,
<__main__.D object at 0x00C46890>, <class '__main__.D'>)
15
class D(object): def __getattr__(self,attr): return attr; #return self.attr; d=D(); print d.foo,type(d.foo); d.foo=15; print d.foo;
foo <type 'str'> 15
class D(object): def __getattr__(self,attr): #return attr; return self.attr; d=D(); print d.foo,type(d.foo); d.foo=15; print d.foo;
RuntimeError: maximum recursion depth exceeded
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有