>æä»¥ï¼æä»¬ä¸ä¸§èãå¤ä½è½ç¶æ¯åï¼å
å¿å´ä¸å¤©æ°ä¼¼ä¸å¤©ãæä»¬è¿è³æè³è½»çè¦æ¥ï¼è¦ä¸ºæä»¬æå°±æéæ æ¯æ°¸è¿çè£èã忥æä»¬ä¸æ¯é¡¾å¿µæè§çï¼ä¹æ¯é¡¾å¿µæä¸è§çï¼å 为æè§çæ¯ææ¶çï¼æä¸è§çæ¯æ°¸è¿çã(2 CORINTHIANS 4:16-18)
#ç¹æ®æ¹æ³(2)
书æ¥ä¸åï¼ä¸ç®¡æ¯å®ä¾è¿æ¯ç±»ï¼é½ç¨`__dict__`æ¥åå¨å±æ§åæ¹æ³ï¼å¯ä»¥ç¬¼ç»å°æå±æ§åæ¹æ³ç§°ä¸ºæåæè
ç¹æ§ï¼ä¸å¥è¯æ¦æ¬ï¼å°±æ¯`__dict__`åå¨å¯¹è±¡æåãä½ï¼ææ¶å访é®ç对象æå没æåå¨å
¶ä¸ï¼å°±æ¯è¿æ ·ï¼
>>> class A(object):
... pass
...
>>> a = A()
>>> a.x
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'A' object has no attribute 'x'
`x`䏿¯å®ä¾çæåï¼ç¨`a.x`访é®ï¼å°±åºéäºï¼å¹¶ä¸é误æç¤ºä¸æ¥åäºåå ï¼â'A' object has no attribute 'x'â
å¨å¾å¤æ
åµä¸ï¼è¿ç§æ¥éæ¯è¶³å¤çäºã使¯ï¼å¨æç§æç°å¨è¿è¯´ä¸åºçæ
åµä¸ï¼ä½ æè®¸ä¸å¸æè¿æ ·æ¥éï¼æè®¸å¸æè½å¤ææç§å«çæç¤ºãæä½çãä¹å°±æ¯æä»¬æ´å¸æè½å¨æåä¸åå¨çæ¶åææä½ä¸ºï¼ä¸æ¯ççæ¥éã
è¦å¤ç类似çé®é¢ï¼å°±è¦ç¨å°æ¬èä¸çç¥è¯äºã
##`__getattr__`ã`__setattr__`åå
¶å®ç±»ä¼¼æ¹æ³
è¿æ¯ç¨ä¸é¢çä¾åï¼å¦æè®¿é®`a.x`ï¼å®ä¸åå¨ï¼é£ä¹å°±è¦è½¬åå°æä¸ªæä½ãæä»¬æè¿ç§æ
åµç§°ä¹ä¸ºâæ¦æªâã就好åâ寻éè
ä¸éâï¼å´è¢«ç«¥åâ饿æè±æâï¼å°ä½ âæ¦æªâäºãå¨Pythonä¸ï¼æä¸äºæ¹æ³å°±å
·æè¿ç§âæ¦æªâè½åã
- `__setattr__(self,name,value)`ï¼å¦æè¦ç»nameèµå¼ï¼å°±è°ç¨è¿ä¸ªæ¹æ³ã
- `__getattr__(self,name)`ï¼å¦æname被访é®ï¼åæ¶å®ä¸åå¨çæ¶åï¼æ¤æ¹æ³è¢«è°ç¨ã
- `__getattribute__(self,name)`ï¼å½nameè¢«è®¿é®æ¶èªå¨è¢«è°ç¨ï¼æ³¨æï¼è¿ä¸ªä»
è½ç¨äºæ°å¼ç±»ï¼ï¼æ 论nameæ¯å¦åå¨ï¼é½è¦è¢«è°ç¨ã
- `__delattr__(self,name)`ï¼å¦æè¦å é¤nameï¼è¿ä¸ªæ¹æ³å°±è¢«è°ç¨ã
妿䏿¶æ²¡æçè§£ï¼ä¸è¦ç´§ï¼æ¯æ£å¸¸çãéè¦ç¨ä¾å说æã
>>> class A(object):
... def __getattr__(self, name):
... print "You use getattr"
... def __setattr__(self, name, value):
... print "You use setattr"
... self.__dict__[name] = value
...
ç±»Aæ¯æ°å¼ç±»ï¼é¤äºä¸¤ä¸ªæ¹æ³ï¼æ²¡æå«ç屿§ã
>>> a = A()
>>> a.x
You use getattr
`a.x`ï¼æç
§æ¬èå¼å¤´çä¾åï¼æ¯è¦æ¥éçã使¯ï¼ç±äºå¨è¿é使ç¨äº`__getattr__(self, name)`æ¹æ³ï¼å½åç°`x`ä¸åå¨äºå¯¹è±¡ç`__dict__`ä¸çæ¶åï¼å°±è°ç¨äº`__getattr__`ï¼å³æè°âæ¦æªæåâã
>>> a.x = 7
You use setattr
ç»å¯¹è±¡ç屿§èµå¼æ¶åï¼è°ç¨äº`__setattr__(self, name, value)`æ¹æ³ï¼è¿ä¸ªæ¹æ³ä¸æä¸å¥`self.__dict__[name] = value`ï¼éè¿è¿ä¸ªè¯å¥ï¼å°±å°å±æ§åæ°æ®ä¿åå°äºå¯¹è±¡ç`__dict__`ä¸ï¼å¦æå¨è°ç¨è¿ä¸ªå±æ§ï¼
>>> a.x
7
å®å·²ç»åå¨äºå¯¹è±¡ç`__dict__`ä¹ä¸ã
å¨ä¸é¢çç±»ä¸ï¼å½ç¶å¯ä»¥ä½¿ç¨`__getattribute__(self, name)`ï¼å ä¸ºå®æ¯æ°å¼ç±»ãå¹¶ä¸ï¼åªè¦è®¿é®å±æ§å°±ä¼è°ç¨å®ãä¾å¦ï¼
>>> class B(object):
... def __getattribute__(self, name):
... print "you are useing getattribute"
... return object.__getattribute__(self, name)
...
为äºä¸åé¢çç±»åºåï¼æ°å½åä¸ä¸ªç±»ååãéè¦æéæ³¨æï¼å¨è¿éè¿åçå
容ç¨çæ¯`return object.__getattribute__(self, name)`ï¼è没æä½¿ç¨`return self.__dict__[name]`忝ãå ä¸ºå¦æç¨è¿æ ·çæ¹å¼ï¼å°±æ¯è®¿é®`self.__dict__`ï¼åªè¦è®¿é®è¿ä¸ªå±æ§ï¼å°±è¦è°ç¨`__getattribute__``ï¼è¿æ ·å°±å¯¼è´äºæ 线éå½ä¸å»ï¼æ»å¾ªç¯ï¼ãè¦é¿å
ä¹ã
>>> b = B()
>>> b.y
you are useing getattribute
Traceback (most recent call last):
File "", line 1, in
File "", line 4, in __getattribute__
AttributeError: 'B' object has no attribute 'y'
>>> b.two
you are useing getattribute
Traceback (most recent call last):
File "", line 1, in
File "", line 4, in __getattribute__
AttributeError: 'B' object has no attribute 'two'
访é®ä¸åå¨çæåï¼å¯ä»¥çå°ï¼å·²ç»è¢«`__getattribute__`æ¦æªäºï¼è½ç¶æåè¿æ¯è¦æ¥éçã
>>> b.y = 8
>>> b.y
you are useing getattribute
8
å½ç»å
¶èµå¼åï¼æå³çå·²ç»å¨`__dict__`éé¢äºï¼åè°ç¨ï¼ä¾ç¶è¢«æ¦æªï¼ä½æ¯ç±äºå·²ç»å¨`__dict__`å
ï¼ä¼æç»æè¿åã
å½ä½ çå°è¿éï¼æ¯ä¸æ¯è§å¾ä¸é¢çæ¹æ³æç¹éåå¢ï¼ä¸éã使¯ï¼å®æä»ä¹å
·ä½åºç¨å¢ï¼çä¸é¢çä¾åï¼è½ç»ä½ 带æ¥å¯åã
#!/usr/bin/env python
# coding=utf-8
"""
study __getattr__ and __setattr__
"""
class Rectangle(object):
"""
the width and length of Rectangle
"""
def __init__(self):
self.width = 0
self.length = 0
def setSize(self, size):
self.width, self.length = size
def getSize(self):
return self.width, self.length
if __name__ == "__main__":
r = Rectangle()
r.width = 3
r.length = 4
print r.getSize()
r.setSize( (30, 40) )
print r.width
print r.length
ä¸é¢ä»£ç æ¥èªãBeginning Python:From Novice to Professional,Second Edittionãï¼by Magnus Lie Hetlandï¼ï¼æ ¹æ®æ¬æç¨çéè¦ï¼ç¨ä½ä¿®æ¹ã
$ python 21301.py
(3, 4)
30
40
è¿æ®µä»£ç å·²ç»å¯ä»¥æ£ç¡®è¿è¡äºã使¯ï¼ä½ä¸ºä¸ä¸ªç²¾çæ±ç²¾çç¨åºåãæ»è§å¾é£ç§è°ç¨æ¹å¼è¿æå¯ä»¥æ¹è¿ç空é´ãæ¯å¦ï¼è¦ç»é¿å®½èµå¼çæ¶åï¼å¿
é¡»èµäºä¸ä¸ªå
ç»ï¼éé¢å
å«é¿å宽ãè¿ä¸ªè½ä¸è½æ¹è¿ä¸ä¸å¢ï¼
#!/usr/bin/env python
# coding=utf-8
"""
study __getattr__ and __setattr__
"""
class Rectangle(object):
"""
the width and length of Rectangle
"""
def __init__(self):
self.width = 0
self.length = 0
def setSize(self, size):
self.width, self.length = size
def getSize(self):
return self.width, self.length
size = property(getSize, setSize)
if __name__ == "__main__":
r = Rectangle()
r.width = 3
r.length = 4
print r.size
r.size = 30, 40
print r.width
print r.length
以ä¸ä»£ç çè¿è¡ç»æåä¸ã使¯ï¼å 为å äºä¸å¥`size = property(getSize, setSize)`ï¼ä½¿å¾è°ç¨æ¹æ³æ¯ä¸æ¯æ´ä¼é
äºå¢ï¼åæ¥ç¨`r.getSize()`ï¼ç°å¨ä½¿ç¨`r.size`ï¼å°±å¥½åè°ç¨ä¸ä¸ªå±æ§ä¸æ ·ãé¾éä½ ä¸è§å¾ç¼çåï¼å¨[ã夿åå°è£
ã](./211.md)ä¸å·²ç»ç¨å°è¿property彿°äºï¼è½ç¶åæ³ç¥æå·®å«ï¼ä½æ¯ä½ç¨ä¸æ ·ã
æ¬æ¥ï¼è¿æ ·å°±å·²ç»è¶³å¤äºã使¯ï¼å 为æ¬èä¸åºæ¥äºç¹æ®æ¹æ³ï¼æä»¥ï¼ä¸å®è¦ç¨è¿äºç¹æ®æ¹æ³ä»æ°æ¼ç»ä¸ä¸è¿æ®µç¨åºãè½ç¶éæ°æ¼ç»çä¸ä¸å®æ¯åæ¥ç好ï¼ä¸»è¦ç®çæ¯æ¼ç¤ºæ¬èçç¹æ®æ¹æ³åºç¨ã
#!/usr/bin/env python
# coding=utf-8
class NewRectangle(object):
def __init__(self):
self.width = 0
self.length = 0
def __setattr__(self, name, value):
if name == "size":
self.width, self.length = value
else:
self.__dict__[name] = value
def __getattr__(self, name):
if name == "size":
return self.width, self.length
else:
raise AttributeError
if __name__ == "__main__":
r = NewRectangle()
r.width = 3
r.length = 4
print r.size
r.size = 30, 40
print r.width
print r.length
é¤äºç±»çæ ·å¼ååä¹å¤ï¼è°ç¨æ ·å¼æ²¡æåãç»ææ¯ä¸æ ·çã
è¿å°±ç®äºè§£äºä¸äºè¿äºå±æ§äºå§ã使¯ï¼æä¸ç¯æç« æ¯è¦å¿
é¡»æ¨èç»è¯»è
é
读çï¼[Python Attributes and Methods](http://www.cafepy.com/article/python_attributes_and_methods/python_attributes_and_methods.html)ï¼è¯»äºè¿ç¯æç« ï¼å¯¹pythonçå¯¹è±¡å±æ§åæ¹æ³ä¼ææ´æ·±å
¥ççè§£ã
##è·å¾å±æ§é¡ºåº
éè¿å®ä¾è·åå
¶å±æ§ï¼ä¹æè¯´ç¹æ§çï¼åè¯ååäºï¼ä½æ¯æ¬è´¨é½æ¯å±æ§åæ¹æ³ï¼ï¼å¦æå¨`__dict__`䏿ç¸åºç屿§ï¼å°±ç´æ¥è¿åå
¶ç»æï¼å¦ææ²¡æï¼ä¼å°ç±»å±æ§ä¸æ¾ãæ¯å¦ï¼
#!/usr/bin/env python
# coding=utf-8
class A(object):
author = "qiwsir"
def __getattr__(self, name):
if name != "author":
return "from starter to master."
if __name__ == "__main__":
a = A()
print a.author
print a.lang
è¿è¡ç¨åºï¼
$ python 21302.py
qiwsir
from starter to master.
å½`a = A()`åï¼å¹¶æ²¡æä¸ºå®ä¾å»ºç«ä»»ä½å±æ§ï¼æè
说å®ä¾ç`__dict__`æ¯ç©ºçï¼è¿å¨ä¸èä¸å·²ç»æ¢è®¨è¿äºã使¯å¦æè¦æ¥ç`a.author`ï¼å 为å®ä¾ç屿§ä¸æ²¡æï¼æä»¥å°±å»ç±»å±æ§ä¸æ¾ï¼åç°æç¶æï¼äºæ¯è¿åå
¶å¼`"qiwsir"`ã使¯ï¼å¨æ¾`a.lang`çæ¶åï¼ä¸ä»
å®ä¾å±æ§ä¸æ²¡æï¼ç±»å±æ§ä¸ä¹æ²¡æï¼äºæ¯å°±è°ç¨äº`__getattr__()`æ¹æ³ãå¨ä¸é¢çç±»ä¸ï¼æè¿ä¸ªæ¹æ³ï¼å¦ææ²¡æ`__getattr__()`æ¹æ³å¢ï¼å¦ææ²¡æå®ä¹è¿ä¸ªæ¹æ³ï¼å°±ä¼å¼åAttributeErrorï¼è¿å¨åé¢å·²ç»çå°äºã
è¿å°±æ¯éè¿å®ä¾æ¥æ¾ç¹æ§ç顺åºã
##åä¸å线
è³æ¤ï¼æ¯å¦æ³¨æå°ï¼æä»¬ä½¿ç¨å¾å¤ä»¥åä¸å线å¼å¤´åç»å°¾çæ¹æ³åï¼æ¯å¦`__dict__`ï¼`__init__`个ãå¨Pythonä¸ï¼ç¨è¿ç§æ¹æ³è¡¨ç¤ºç¹æ®çæ¹æ³åï¼å½ç¶ï¼è¿æ¯ä¸ä¸ªæ¯ä¾ï¼ä¹æä»¥è¿æ ·åï¼ä¸»è¦æ¯ç¡®ä¿è¿äºç¹æ®çæ¹æ³åä¸ä¼è·ä½ èªå·±æå®ä¹çåç§°å²çªï¼æä»¬èªå·±å®ä¹åç§°çæ¶åï¼æ¯ç»å°ç¨åå线å¼å¤´åç»å°¾çãå¦æä½ éè¦éåè¿äºæ¹æ³ï¼å½ç¶æ¯å¯ä»¥çï¼å
·ä½åçåæå
³äºç»§æ¿ç讲述ã
------
[æ»ç®å½](./index.md) | [ä¸èï¼ç¹æ®æ¹æ³(1)](./212.md) | [ä¸èï¼è¿ä»£å¨](./214.md)
å¦æä½ è®¤ä¸ºæå¿
è¦æèµæï¼è¯·éè¿æ¯ä»å®ï¼**[email protected]**,ä¸èææ¿ã