ÃæÏò¶ÔÏóÖØÒªµÄ¸ÅÄî¾ÍÊÇÀà(Class)ºÍʵÀý(Instance)£¬ÀàÊdzéÏóµÄÄ£°å£¬¶øÊµÀýÊǸù¾ÝÀà´´½¨³öÀ´µÄÒ»¸ö¸ö¾ßÌåµÄ¡°¶ÔÏó¡±£¬Ã¿¸ö¶ÔÏó¶¼ÓµÓÐÏàͬµÄ·½·¨£¬µ«¸÷×ÔµÄÊý¾Ý¿ÉÄܲ»Í¬¡£
ÏȻعËÏ OOP µÄ³£ÓÃÊõÓ
Àࣺ¶Ô¾ßÓÐÏàͬÊý¾ÝºÍ·½·¨µÄÒ»×é¶ÔÏóµÄÃèÊö»ò¶¨Òå¡£
¶ÔÏ󣺶ÔÏóÊÇÒ»¸öÀàµÄʵÀý¡£
ʵÀý(instance)£ºÒ»¸ö¶ÔÏóµÄʵÀý»¯ÊµÏÖ¡£
ʵÀýÊôÐÔ(instance attribute)£ºÒ»¸ö¶ÔÏó¾ÍÊÇÒ»×éÊôÐԵļ¯ºÏ¡£
ʵÀý·½·¨(instance method)£ºËùÓдæÈ¡»òÕ߸üжÔÏóij¸öʵÀýÒ»Ìõ»òÕß¶àÌõÊôÐԵĺ¯ÊýµÄ¼¯ºÏ¡£
ÀàÊôÐÔ(classattribute)£ºÊôÓÚÒ»¸öÀàÖÐËùÓжÔÏóµÄÊôÐÔ£¬²»»áÖ»ÔÚij¸öʵÀýÉÏ·¢Éú±ä»¯
Àà·½·¨(classmethod)£ºÄÇЩÎÞÐëÌØ¶¨µÄ¶ÔÏóʵÀý¾ÍÄܹ»¹¤×÷µÄ´ÓÊôÓÚÀàµÄº¯Êý¡£
Àà¸ÅÊö
ÔÚPythonÖУ¬¶¨ÒåÀàÊÇͨ¹ýclass¹Ø¼ü×Ö£º
class Student(object): pass |
classºóÃæ½ô½Ó×ÅÊÇÀàÃû£¬¼´Student£¬ÀàÃûͨ³£ÊÇ´óд¿ªÍ·µÄµ¥´Ê£¬½ô½Ó×ÅÊÇ(object)£¬±íʾ¸ÃÀàÊÇ´ÓÄĸöÀà¼Ì³ÐÏÂÀ´µÄ¡£Í¨³££¬Èç¹ûûÓкÏÊʵļ̳ÐÀ࣬¾ÍʹÓÃobjectÀ࣬ÕâÊÇËùÓÐÀà×îÖÕ¶¼»á¼Ì³ÐµÄÀà¡£
¶¨ÒåºÃÁËStudentÀ࣬¾Í¿ÉÒÔ¸ù¾ÝStudentÀà´´½¨³öStudentµÄʵÀý£¬´´½¨ÊµÀýÊÇͨ¹ýÀàÃû+()ʵÏֵģº
>>> bart = Student() >>> bart <__main__.Student object at 0x10a67a590> >>> Student <class '__main__.Student'> |
¿ÉÒÔ¿´µ½£¬±äÁ¿bartÖ¸ÏòµÄ¾ÍÊÇÒ»¸öStudentµÄobject£¬ºóÃæµÄ0x10a67a590ÊÇÄÚ´æµØÖ·£¬Ã¿¸öobjectµÄµØÖ·¶¼²»Ò»Ñù£¬¶øStudent±¾ÉíÔòÊÇÒ»¸öÀà¡£
¿ÉÒÔ×ÔÓɵظøÒ»¸öʵÀý±äÁ¿°ó¶¨ÊôÐÔ£¬±ÈÈ磬¸øÊµÀýbart°ó¶¨Ò»¸önameÊôÐÔ£º
>>> bart.name = 'Bart Simpson' >>> bart.name 'Bart Simpson' |
ÓÉÓÚÀà¿ÉÒÔÆðµ½Ä£°åµÄ×÷Óã¬Òò´Ë£¬¿ÉÒÔÔÚ´´½¨ÊµÀýµÄʱºò£¬°ÑһЩÎÒÃÇÈÏΪ±ØÐë°ó¶¨µÄÊôÐÔÇ¿ÖÆÌîд½øÈ¥¡£Í¨¹ý¶¨ÒåÒ»¸öÌØÊâµÄinit·½·¨£¬ÔÚ´´½¨ÊµÀýµÄʱºò£¬¾Í°Ñname£¬scoreµÈÊôÐÔ°óÉÏÈ¥¡£
class Student(object): def __init__(self, name, score): self.name = name self.score = score |
×¢Òâµ½init·½·¨µÄµÚÒ»¸ö²ÎÊýÓÀÔ¶ÊÇself£¬±íʾ´´½¨µÄʵÀý±¾Éí£¬Òò´Ë£¬ÔÚinit·½·¨ÄÚ²¿£¬¾Í¿ÉÒ԰Ѹ÷ÖÖÊôÐ԰󶨵½self£¬ÒòΪself¾ÍÖ¸Ïò´´½¨µÄʵÀý±¾Éí¡£
ÓÐÁËinit·½·¨£¬ÔÚ´´½¨ÊµÀýµÄʱºò£¬¾Í²»ÄÜ´«Èë¿ÕµÄ²ÎÊýÁË£¬±ØÐë´«ÈëÓëinit·½·¨Æ¥ÅäµÄ²ÎÊý£¬µ«self²»ÐèÒª´«£¬Python½âÊÍÆ÷×Ô¼º»á°ÑʵÀý±äÁ¿´«½øÈ¥£º
>>> bart = Student('Bart Simpson', 59) >>> bart.name 'Bart Simpson' >>> bart.score 59 |
ºÍÆÕͨµÄº¯ÊýÏà±È£¬ÔÚÀàÖж¨ÒåµÄ¶ÔÏóº¯Êý(»¹Óо²Ì¬·½·¨£¬Àà·½·¨)Ö»ÓÐÒ»µã²»Í¬£¬¾ÍÊǵÚÒ»¸ö²ÎÊýÓÀÔ¶ÊÇʵÀý±äÁ¿self£¬²¢ÇÒ£¬µ÷ÓÃʱ²»Óô«µÝ¸Ã²ÎÊý¡£
ÐÂʽÀà¡¢¾ÉʽÀà
pythonµÄÐÂʽÀàÊÇ2.2°æ±¾Òý½øÀ´µÄ£¬Ö®Ç°µÄÀà½Ð×ö¾µäÀà»òÕß¾ÉÀà¡£Python 2.x ÖÐÈç¹ûÒ»¸öÀà¼Ì³ÐÓÚÒ»¸ö»ùÀà(¿ÉÒÔÊÇ×Ô¶¨ÒåÀà»òÕ߯äËüÀà)»òÕ߼̳Ð×Ô
object£¬Ôò¸ÃÀàΪÐÂʽÀà;ûÓм̳еÄÀàΪ¾µäÀà¡£Python 3.x ÔòÈ«²¿ÎªÐÂʽÀà¡£
ÐÂʽÀà±»¸³ÓèÁ˺ܶàеÄÌØÐÔ(È磺ͳһÁËtypesºÍclasses)£¬²¢¸Ä±äÁËÒÔÍù¾µäÀàµÄһЩÄÚÈÝ(È磺¸Ä±äÁ˶à¼Ì³ÐÏ·½·¨µÄÖ´ÐÐ˳Ðò)¡£
¹ØÓÚͳһÀà(class)ºÍÀàÐÍ(type)£¬¾ßÌå¿´ÏÂÃæµÄÀý×Ó
class OldClass(): pass o = OldClass() print o.__class__ # __main__.OldClass print type(o) # <type 'instance'> class newClass(object): pass n = newClass() print n.__class__ # <class '__main__.newClass'> print type(n) # <class '__main__.newClass'> |
¶ÔÏóÊôÐÔ
Python ÖжÔÏóµÄÊôÐÔ°üº¬¶ÔÏóµÄËùÓÐÄÚÈÝ£º·½·¨ºÍÊý¾Ý£¬×¢Òâ·½·¨Ò²ÊǶÔÏóµÄÊôÐÔ¡£²éÕÒ¶ÔÏóµÄÊôÐÔʱ£¬Ê×ÏÈÔÚ¶ÔÏóµÄ__dict__
ÀïÃæ²éÕÒ£¬È»ºóÊǶÔÏóËùÊôÀàµÄdict£¬ÔÙÍùºóÊǼ̳ÐÌåϵÖи¸Àà(MRO½âÎö)µÄdict£¬ÈÎÒâÒ»¸öµØ·½²éÕÒµ½¾ÍÖÕÖ¹²éÕÒ£¬²¢ÇÒµ÷ÓÃ
__getattribute__(Ò²ÓпÉÄÜÊÇ__getattr__) ·½·¨»ñµÃÊôÐÔÖµ¡£
·½·¨
ÔÚ Python ÀàÖÐÓÐ3ÖÖ·½·¨£¬¼´¾²Ì¬·½·¨(staticmethod)£¬Àà·½·¨(classmethod)ºÍʵÀý·½·¨£º
¶ÔÓÚʵÀý·½·¨£¬ÔÚÀàÀïÿ´Î¶¨ÒåʵÀý·½·¨µÄʱºò¶¼ÐèÒªÖ¸¶¨ÊµÀý(¸Ã·½·¨µÄµÚÒ»¸ö²ÎÊý£¬Ãû×ÖÔ¼¶¨³ÉË×Ϊself)¡£ÕâÊÇÒòΪʵÀý·½·¨µÄµ÷ÓÃÀë²»¿ªÊµÀý£¬ÎÒÃDZØÐë¸øº¯Êý´«µÝÒ»¸öʵÀý¡£¼ÙÉè¶ÔÏóa¾ßÓÐʵÀý·½·¨
foo(self, *args, **kwargs)£¬ÄÇôµ÷ÓõÄʱºò¿ÉÒÔÓà a.foo(*args, **kwargs)£¬»òÕß
A.foo(a, *args, **kwargs)£¬ÔÚ½âÊÍÆ÷¿´À´ËüÃÇÊÇÍêȫһÑùµÄ¡£
Àà·½·¨Ã¿´Î¶¨ÒåµÄʱºòÐèÒªÖ¸¶¨Àà(¸Ã·½·¨µÄµÚÒ»¸ö²ÎÊý£¬Ãû×ÖÔ¼¶¨³ÉË×Ϊcls)£¬µ÷ÓÃʱºÍʵÀý·½·¨ÀàËÆÐèÒªÖ¸¶¨Ò»¸öÀà¡£
¾²Ì¬·½·¨ÆäʵºÍÆÕͨµÄ·½·¨Ò»Ñù£¬Ö»²»¹ýÔÚµ÷ÓõÄʱºòÐèҪʹÓÃÀà»òÕßʵÀý¡£Ö®ËùÒÔÐèÒª¾²Ì¬·½·¨£¬ÊÇÒòΪÓÐʱºòÐèÒª½«Ò»×éÂß¼ÉÏÏà¹ØµÄº¯Êý·ÅÔÚÒ»¸öÀàÀïÃæ£¬±ãÓÚ×éÖ¯´úÂë½á¹¹¡£Ò»°ãÈç¹ûÒ»¸ö·½·¨²»ÐèÒªÓõ½self£¬ÄÇôËü¾ÍÊʺÏÓÃ×÷¾²Ì¬·½·¨¡£
¾ßÌåµÄÀý×ÓÈçÏ£º
def foo(x): print "executing foo(%s)"%(x) class A(object): def foo(self): print "executing foo(%s)" % self @classmethod def class_foo(cls): print "executing class_foo(%s)" % cls @staticmethod def static_foo(): print "executing static_foo()" a = A() print a.foo print A.foo print a.class_foo print A.class_foo print A.static_foo print a.static_foo print foo # <bound method A.foo of <__main__.A object at 0x10d5f90d0>> # <unbound method A.foo> # <bound method type.class_foo of <class '__main__.A'>> # <bound method type.class_foo of <class '__main__.A'>> # <function static_foo at 0x10d5f32a8> # <function static_foo at 0x10d5f32a8> # <function foo at 0x10d5f1ed8> |
ÔÚ·ÃÎÊÀà·½·¨µÄʱºòÓÐÁ½ÖÖ·½·¨£¬·Ö±ð½Ð×ö δ°ó¶¨µÄ·½·¨(unbound method) ºÍ °ó¶¨µÄ·½·¨(bound method)£º
δ°ó¶¨µÄ·½·¨£ºÍ¨¹ýÀàÀ´ÒýÓÃʵÀý·½·¨·µ»ØÒ»¸öδ°ó¶¨·½·¨¶ÔÏó¡£Òªµ÷ÓÃËü£¬Äã±ØÐëÏÔʾµØÌṩһ¸öʵÀý×÷ΪµÚÒ»¸ö²ÎÊý£¬±ÈÈç
A.foo¡£
°ó¶¨µÄ·½·¨£ºÍ¨¹ýʵÀý·ÃÎÊ·½·¨·µ»ØÒ»¸ö°ó¶¨µÄ·½·¨¶ÔÏó¡£Python×Ô¶¯µØ¸ø·½·¨°ó¶¨Ò»¸öʵÀý£¬ËùÒÔµ÷ÓÃËüʱ²»ÓÃÔÙ´«Ò»¸öʵÀý²ÎÊý£¬±ÈÈç
a.foo¡£
Êý¾ÝÊôÐÔ
ÏÂÃæ´´½¨ÁËÒ»¸öStudentµÄÀ࣬²¢ÇÒʵÏÖÁËÕâ¸öÀàµÄ³õʼ»¯º¯Êý"__init__":
class Student(object): count = 0 books = [] def __init__(self, name, age): self.name = name self.age = age |
ÔÚÉÏÃæµÄStudentÀàÖУ¬count, books, name ºÍ age ¶¼±»³ÆÎªÀàµÄÊý¾ÝÊôÐÔ£¬µ«ÊÇËüÃÇÓÖ·ÖΪÀàÊý¾ÝÊôÐÔºÍʵÀýÊý¾ÝÊôÐÔ¡£Ö±½Ó¶¨ÒåÔÚÀàÌåÖеÄÊôÐÔ½ÐÀàÊôÐÔ£¬¶øÔÚÀàµÄ·½·¨Öж¨ÒåµÄÊôÐÔ½ÐʵÀýÊôÐÔ¡£
Ê×ÏÈ¿´ÏÂÃæ´úÂ룬չʾÁ˶ÔÀàÊý¾ÝÊôÐÔºÍʵÀýÊý¾ÝÊôÐԵķÃÎÊ£º
Student.books.extend(["python", "javascript"]) print "Student book list: %s" %Student.books # class can add class attribute after class definition Student.hobbies = ["reading", "jogging", "swimming"] print "Student hobby list: %s" %Student.hobbies print dir(Student) # class instance attribute wilber = Student("Wilber", 28) print "%s is %d years old" %(wilber.name, wilber.age) # class instance can add new attribute # "gender" is the instance attribute only belongs to wilber wilber.gender = "male" print "%s is %s" %(wilber.name, wilber.gender) # class instance can access class attribute wilber.books.append("C#") print wilber.books |
print wilber.books ͨ¹ýÄÚ½¨º¯Êýdir()£¬»òÕß·ÃÎÊÀàµÄ×ÖµäÊôÐÔ__dict__£¬ÕâÁ½ÖÖ·½Ê½¶¼¿ÉÒԲ鿴Àà»òÕßʵÀýÓÐÄÄЩÊôÐÔ¡£¶ÔÓÚÀàÊý¾ÝÊôÐÔºÍʵÀýÊý¾ÝÊôÐÔ£¬¿ÉÒÔ×ܽáΪ£º
ÀàÊý¾ÝÊôÐÔÊôÓÚÀà±¾Éí£¬¿ÉÒÔͨ¹ýÀàÃû½øÐзÃÎÊ/ÐÞ¸Ä;
ÀàÊý¾ÝÊôÐÔÒ²¿ÉÒÔ±»ÀàµÄËùÓÐʵÀý·ÃÎÊ/ÐÞ¸Ä;
ÔÚÀඨÒåÖ®ºó£¬¿ÉÒÔͨ¹ýÀàÃû¶¯Ì¬Ìí¼ÓÀàÊý¾ÝÊôÐÔ£¬ÐÂÔöµÄÀàÊôÐÔÒ²±»ÀàºÍËùÓÐʵÀý¹²ÓÐ
ʵÀýÊý¾ÝÊôÐÔÖ»ÄÜͨ¹ýʵÀý·ÃÎÊ;
ÔÚʵÀýÉú³Éºó£¬»¹¿ÉÒÔ¶¯Ì¬Ìí¼ÓʵÀýÊý¾ÝÊôÐÔ£¬µ«ÊÇÕâЩʵÀýÊý¾ÝÊôÐÔÖ»ÊôÓÚ¸ÃʵÀý;
ÔÙ¿´ÏÂÃæµÄ³ÌÐò
class Person: name="aaa" p1=Person() p2=Person() p1.name="bbb" print p1.name # bbb print p2.name # aaa print Person.name # aaa |
ÉÏÃæ³ÌÐòÖУ¬p1.name="bbb"ÊÇʵÀýµ÷ÓÃÁËÀà±äÁ¿£¬p1.nameÒ»¿ªÊ¼ÊÇÖ¸ÏòµÄÀà±äÁ¿name="aaa"£¬µ«ÊÇÔÚʵÀýµÄ×÷ÓÃÓòÀï°ÑÀà±äÁ¿µÄÒýÓøıäÁË£¬¾Í±ä³ÉÁËÒ»¸öʵÀý±äÁ¿¡£self.name²»ÔÙÒýÓÃPersonµÄÀà±äÁ¿nameÁË¡£
class Person: name=[] p1=Person() p2=Person() p1.name.append(1) print p1.name # [1] print p2.name # [1] print Person.name # [1] |
ÌØÊâµÄÀàÊôÐÔ
¶ÔÓÚËùÓеÄÀ࣬¶¼ÓÐÒ»×éÌØÊâµÄÊôÐÔ£º

ͨ¹ýÕâЩÊôÐÔ£¬¿ÉÒԵõ½ StudentÀàµÄһЩÐÅÏ¢£¬ÈçÏ£º

ÀàµÄ¼Ì Python ÊÇÃæÏò¶ÔÏóÓïÑÔ£¬Ö§³ÖÀàµÄ¼Ì³Ð(°üÀ¨µ¥ÖغͶàÖØ¼Ì³Ð)£¬¼Ì³ÐµÄÓï·¨ÈçÏ£º
class DerivedClass(BaseClass1, [BaseClass2...]): <statement-1> . <statement-N> |
×ÓÀà¿ÉÒÔ¸²¸Ç¸¸ÀàµÄ·½·¨£¬´ËʱÓÐÁ½ÖÖ·½·¨À´µ÷Óø¸ÀàÖеĺ¯Êý£º
µ÷Óø¸ÀàµÄδ°ó¶¨µÄ¹¹Ôì·½·¨¡£ÔÚµ÷ÓÃÒ»¸öʵÀýµÄ·½·¨Ê±£¬¸Ã·½·¨µÄself²ÎÊý»á±»×Ô¶¯°ó¶¨µ½ÊµÀýÉÏ(³ÆÎª°ó¶¨·½·¨)¡£µ«Èç¹ûÖ±½Óµ÷ÓÃÀàµÄ·½·¨(±ÈÈçA.init)£¬ÄÇô¾ÍûÓÐʵÀý»á±»°ó¶¨¡£ÕâÑù¾Í¿ÉÒÔ×ÔÓɵÄÌṩÐèÒªµÄself²ÎÊý£¬ÕâÖÖ·½·¨³ÆÎªÎ´°ó¶¨(unbound)·½·¨¡£´ó¶àÊýÇé¿öÏÂÊÇ¿ÉÒÔÕý³£¹¤×÷µÄ£¬µ«ÊǶàÖØ¼Ì³ÐµÄʱºò¿ÉÄÜ»áÖØ¸´µ÷Óø¸Àà¡£
ͨ¹ý super(cls, inst).method() µ÷Óà MROÖÐÏÂÒ»¸öÀàµÄº¯Êý£¬ÕâÀïÓÐÒ»¸ö·Ç³£²»´íµÄ½âÊÍ£¬¿´Íêºó¶Ô
super Ó¦¸Ã¾ÍÊìϤÁË¡£
δ°ó¶¨(unbound)·½·¨µ÷ÓÃÈçÏ£º
class Base(object): def __init__(self): print("Base.__init__") class Derived(Base): def __init__(self): Base.__init__(self) print("Derived.__init__") |
supper µ÷ÓÃÈçÏ£º
class Base(object): def __init__(self): print "Base.__init__" class Derived(Base): def __init__(self): super(Derived, self).__init__() print "Derived.__init__" class Derived_2(Derived): def __init__(self): super(Derived_2, self).__init__() print "Derived_2.__init__" |
¼Ì³Ð»úÖÆ MRO
MRO Ö÷ÒªÓÃÓÚÔÚ¶à¼Ì³ÐʱÅжϵ÷ÓõÄÊôÐÔÀ´×ÔÓÚÄĸöÀà¡£Python2.2ÒÔǰµÄÀàΪ¾µäÀ࣬ËüÊÇÒ»ÖÖûÓм̳еÄÀ࣬ʵÀýÀàÐͶ¼ÊÇtypeÀàÐÍ£¬Èç¹û¾µäÀà±»×÷Ϊ¸¸À࣬×ÓÀàµ÷Óø¸ÀàµÄ¹¹Ô캯Êýʱ»á³ö´í¡£ÕâʱMROµÄ·½·¨ÎªDFS(Éî¶ÈÓÅÏÈËÑË÷)£¬×Ó½Úµã˳Ðò£º´Ó×óµ½ÓÒ¡£inspect.getmro(A)¿ÉÒԲ鿴¾µäÀàµÄMRO˳Ðò¡£
Á½Öּ̳ÐģʽÔÚDFSϵÄÓÅȱµã:
µÚÒ»ÖÖ£¬Á½¸ö»¥²»Ïà¹ØµÄÀàµÄ¶à¼Ì³Ð£¬ÕâÖÖÇé¿öDFS˳ÐòÕý³££¬²»»áÒýÆðÈκÎÎÊÌâ;
µÚ¶þÖÖ£¬ÀâÐμ̳Ðģʽ£¬´æÔÚ¹«¹²¸¸Àà(D)µÄ¶à¼Ì³Ð£¬ÕâÖÖÇé¿öÏÂDFS±Ø¶¨¾¹ý¹«¹²¸¸Àà(D)¡£Èç¹ûÕâ¸ö¹«¹²¸¸Àà(D)ÓÐһЩ³õʼ»¯ÊôÐÔ»òÕß·½·¨£¬µ«ÊÇ×ÓÀà(C)ÓÖÖØÐ´ÁËÕâЩÊôÐÔ»òÕß·½·¨£¬ÄÇô°´ÕÕDFS˳Ðò±Ø¶¨ÊÇ»áÏÈÕÒµ½DµÄÊôÐÔ»ò·½·¨£¬ÄÇôCµÄÊôÐÔ»òÕß·½·¨½«ÓÀÔ¶·ÃÎʲ»µ½£¬µ¼ÖÂCÖ»Äܼ̳ÐÎÞ·¨ÖØÐ´(override)¡£ÕâÒ²¾ÍÊÇÐÂʽÀ಻ʹÓÃDFSµÄÔÒò£¬ÒòΪËûÃǶ¼ÓÐÒ»¸ö¹«¹²µÄ׿ÏÈobject¡£
ΪÁËʹÀàºÍÄÚÖÃÀàÐ͸ü¼Óͳһ£¬Python2.2°æ±¾ÒýÈëÁËÐÂʽÀà¡£ÐÂʽÀàµÄÿ¸öÀà¶¼¼Ì³ÐÓÚÒ»¸ö»ùÀ࣬¿ÉÒÔÊÇ×Ô¶¨ÒåÀà»òÕ߯äËüÀ࣬ĬÈϳÐÓÚobject£¬×ÓÀà¿ÉÒÔµ÷Óø¸ÀàµÄ¹¹Ô캯Êý¡£¿ÉÒÔÓÃ
A.__mro__ ¿ÉÒԲ鿴ÐÂʽÀàµÄ˳Ðò¡£
ÔÚ 2.2 ÖУ¬ÓÐÁ½ÖÖMROµÄ·½·¨£º
Èç¹ûÊǾµäÀàMROΪDFS;
Èç¹ûÊÇÐÂʽÀàMROΪBFS(¹ã¶ÈÓÅÏÈËÑË÷)£¬×Ó½Úµã˳Ðò£º´Ó×óµ½ÓÒ¡£

ÐÂʽÀàÁ½Öּ̳ÐģʽÔÚBFSϵÄÓÅȱµã:
µÚÒ»ÖÖ£¬Õý³£¼Ì³Ðģʽ¡£±ÈÈçBÃ÷Ã÷¼Ì³ÐÁËDµÄij¸öÊôÐÔ(¼ÙÉèΪfoo)£¬CÖÐҲʵÏÖÁËÕâ¸öÊôÐÔfoo£¬ÄÇôBFSÃ÷Ã÷ÏÈ·ÃÎÊBÈ»ºóÔÙÈ¥·ÃÎÊC£¬µ«ÊÇAµÄfooÊôÐÔÊÇc£¬Õâ¸öÎÊÌâ³ÆÎªµ¥µ÷ÐÔÎÊÌâ¡£
µÚ¶þÖÖ£¬ÀâÐμ̳Ðģʽ£¬BFSµÄ²éÕÒ˳Ðò½â¾öÁËDFS˳ÐòÖеÄÖ»Äܼ̳ÐÎÞ·¨ÖØÐ´µÄÎÊÌâ¡£
ÒòΪDFS ºÍ BFS ¶¼´æÔڽϴóµÄÎÊÌ⣬ËùÒÔ´ÓPython2.3¿ªÊ¼ÐÂʽÀàµÄ
MRO²ÉÓÃÁËC3Ëã·¨£¬½â¾öÁ˵¥µ÷ÐÔÎÊÌ⣬ºÍÖ»Äܼ̳ÐÎÞ·¨ÖØÐ´µÄÎÊÌâ¡£MROµÄC3Ë㷨˳ÐòÈçÏÂͼ£º

C3 ²ÉÓÃͼµÄÍØÆËÅÅÐòËã·¨£¬¾ßÌåʵÏÖ¿ÉÒԲο¼¹ÙÍøÎĵµ¡£
¶à̬
¶à̬¼´¶àÖÖÐÎ̬£¬ÔÚÔËÐÐʱȷ¶¨Æä״̬£¬ÔÚ±àÒë½×¶ÎÎÞ·¨È·¶¨ÆäÀàÐÍ£¬Õâ¾ÍÊǶà̬¡£PythonÖеĶà̬ºÍJavaÒÔ¼°C++ÖеĶà̬Óе㲻ͬ£¬PythonÖеıäÁ¿ÊǶ¯Ì¬ÀàÐ͵ģ¬ÔÚ¶¨Òåʱ²»ÓÃÖ¸Ã÷ÆäÀàÐÍ£¬Ëü»á¸ù¾ÝÐèÒªÔÚÔËÐÐʱȷ¶¨±äÁ¿µÄÀàÐÍ¡£
Python±¾ÉíÊÇÒ»ÖÖ½âÊÍÐÔÓïÑÔ£¬²»½øÐÐÔ¤±àÒ룬Òò´ËËü¾ÍÖ»ÔÚÔËÐÐʱȷ¶¨Æä״̬£¬¹ÊÒ²ÓÐÈË˵PythonÊÇÒ»ÖÖ¶à̬ÓïÑÔ¡£ÔÚPythonÖÐºÜ¶àµØ·½¶¼¿ÉÒÔÌåÏÖ¶à̬µÄÌØÐÔ£¬±ÈÈçÄÚÖú¯Êýlen(object)£¬lenº¯Êý²»½ö¿ÉÒÔ¼ÆËã×Ö·û´®µÄ³¤¶È£¬»¹¿ÉÒÔ¼ÆËãÁÐ±í¡¢Ôª×éµÈ¶ÔÏóÖеÄÊý¾Ý¸öÊý£¬ÕâÀïÔÚÔËÐÐʱͨ¹ý²ÎÊýÀàÐÍÈ·¶¨Æä¾ßÌåµÄ¼ÆËã¹ý³Ì£¬ÕýÊǶà̬µÄÒ»ÖÖÌåÏÖ¡£
ÌØÊâµÄÀà·½·¨
ÀàÖо³£ÓÐһЩ·½·¨ÓÃÁ½¸öÏ»®Ïß°üΧÀ´ÃüÃû£¬ÏÂͼ¸ø³öһЩÀý×Ó¡£ºÏÀíµØÊ¹ÓÃËüÃÇ¿ÉÒÔ¶ÔÀàÌí¼ÓһЩ¡°Ä§·¨¡±µÄÐÐΪ¡£

¹¹ÔìÓëÎö¹¹
µ±ÎÒÃǵ÷Óà x = SomeClass() µÄʱºò£¬µÚÒ»¸ö±»µ÷Óõĺ¯ÊýÊÇ
__new__ £¬Õâ¸ö·½·¨´´½¨ÊµÀý¡£½ÓÏÂÀ´¿ÉÒÔÓà __init__ À´Ö¸Ã÷Ò»¸ö¶ÔÏóµÄ³õʼ»¯ÐÐΪ¡£µ±Õâ¸ö¶ÔÏóµÄÉúÃüÖÜÆÚ½áÊøµÄʱºò£¬
__del__ »á±»µ÷Óá£
__new__(cls,[...]) ÊǶÔÏóʵÀý»¯Ê±µÚÒ»¸öµ÷Óõķ½·¨£¬ËüֻȡÏÂ
cls ²ÎÊý£¬²¢°ÑÆäËû²ÎÊý´«¸øinit¡£
__init__(self,[...]) ΪÀàµÄ³õʼ»¯·½·¨¡£Ëü»ñÈ¡Èκδ«¸ø¹¹ÔìÆ÷µÄ²ÎÊý(±ÈÈçÎÒÃǵ÷ÓÃ
x = SomeClass(10, ¡®foo¡¯) £¬init º¯Êý¾Í»á½Óµ½²ÎÊý 10 ºÍ ¡®foo¡¯)
¡£
__del__(self)£ºnewºÍinitÊǶÔÏóµÄ¹¹ÔìÆ÷£¬ delÔòÊǶÔÏóµÄÏú»ÙÆ÷¡£Ëü²¢·ÇʵÏÖÁËÓï¾ä
del x (Òò´Ë¸ÃÓï¾ä²»µÈͬÓÚx.__del__())£¬¶øÊǶ¨Òåµ±¶ÔÏó±»»ØÊÕʱµÄÐÐΪ¡£
µ±ÎÒÃÇ´´½¨Ò»¸öÀàµÄʵÀýʱ£¬Ê×ÏÈ»áµ÷ÓÃnew´´½¨ÊµÀý£¬½Ó×ŲŻáµ÷ÓÃinitÀ´½øÐгõʼ»¯¡£²»¹ý×¢ÒâÔÚ¾ÉʽÀàÖУ¬ÊµÀýµÄ´´½¨²¢Ã»Óе÷ÓÃnew·½·¨£¬ÈçÏÂÀý×Ó£º
class A: def __new__(cls): print "A.__new__ is called" # -> this is never called A() |
¶ÔÓÚÐÂʽÀàÀ´Ëµ£¬ÎÒÃÇ¿ÉÒÔ¸²¸Çnew·½·¨£¬×¢Òâ¸Ã·½·¨µÄµÚÒ»¸ö²ÎÊýcls(Æäʵ¾ÍÊǵ±Ç°ÀàÀàÐÍ)ÓÃÀ´Ö¸Ã÷Òª´´½¨µÄÀàÐÍ£¬ºóÐø²ÎÊýÓÃÀ´´«µÝ¸øinit½øÐгõʼ»¯¡£Èç¹ûnew·µ»ØÁËclsÀàÐ͵ĶÔÏó£¬ÄÇô½ÓÏÂÀ´µ÷ÓÃinit£¬·ñÔòµÄ»°²»»áµ÷ÓÃinit(µ÷Óø÷½·¨±ØÐë´«µÝÒ»¸öʵÀý¶ÔÏó)¡£
class A(object): # -> don't forget the object specified as base def __new__(cls): print "A.__new__ called" return super(A, cls).__new__(cls) def __init__(self): print "A.__init__ called" A() # A.__new__ called # A.__init__ called |
ÕâÀïÎÒÃǵ÷ÓÃsuper()À´»ñÈ¡ MRO ÖÐAµÄÏÂÒ»¸öÀà(ÔÚÕâÀïÆäʵ¾ÍÊÇ»ùÀà object)µÄnew·½·¨À´´´½¨Ò»¸öclsµÄʵÀý¶ÔÏ󣬽Ó×ÅÓÃÕâ¸ö¶ÔÏóÀ´µ÷ÓÃÁËinit¡£ÏÂÃæµÄÀý×ÓÖУ¬²¢Ã»Óзµ»ØÒ»¸öºÏÊʵĶÔÏó£¬ËùÒÔ²¢Ã»Óе÷ÓÃinit£º
class
Sample(object):
def __str__(self):
return "SAMPLE"
class A(object):
def __new__(cls):
print "A.__new__ called"
return super(A, cls).__new__(Sample)
# return Sample()
def __init__(self):
print "A.__init__ called" # -> is actually
never called
a = A()
# A.__new__ called |
¹ØÓÚ super£¬ÕâÀïÊÇÒ»¸ö·Ç³£²»´íµÄ½âÊÍ£¬¼òµ¥À´Ëµsuper×öÁËÏÂÃæµÄÊÂÇ飺
def super(cls, inst): mro = inst.__class__.mro() return mro[mro.index(cls) + 1] |
¹ØÓÚ MRO£¬ÕâÆªÎÄÕ·dz£°ô£ºÄãÕæµÄÀí½âPythonÖÐMROËã·¨Âð?£¬¼òµ¥À´Ëµ£¬ÔÚÐÂʽÀàMROµÄ C3 Ëã·¨ÖУ¬±£Ö¤£º»ùÀàÓÀÔ¶³öÏÖÔÚÅÉÉúÀàºóÃæ£¬Èç¹ûÓжà¸ö»ùÀ࣬»ùÀàµÄÏà¶Ô˳Ðò±£³Ö²»±ä¡£
²Ù×÷·û
ÀûÓÃÌØÊâ·½·¨¿ÉÒÔ¹¹½¨Ò»¸öÓµÓÐPythonÄÚÖÃÀàÐÍÐÐΪµÄ¶ÔÏó£¬ÕâÒâζ×Å¿ÉÒÔ±ÜÃâʹÓ÷DZê×¼µÄ¡¢³óªµÄ·½Ê½À´±í´ï¼òµ¥µÄ²Ù×÷¡£ÔÚһЩÓïÑÔÖУ¬ÕâÑù×öºÜ³£¼û:
if instance.equals(other_instance): # do something |
PythonÖе±È»Ò²¿ÉÒÔÕâô×ö£¬µ«ÊÇÕâÑù×öÈôúÂë±äµÃÈß³¤¶ø»ìÂÒ¡£²»Í¬µÄÀà¿â¿ÉÄܶÔͬһÖֱȽϲÙ×÷²ÉÓò»Í¬µÄ·½·¨Ãû³Æ£¬ÕâÈÃʹÓÃÕßÐèÒª×öºÜ¶àûÓбØÒªµÄ¹¤×÷¡£Òò´ËÎÒÃÇ¿ÉÒÔ¶¨Òå·½·¨__eq__£¬È»ºó¾Í¿ÉÒÔÏñÏÂÃæÕâÑùʹÓãº
if instance == other_instance: # do something |
Python ÓÐÐí¶àÌØÊâµÄº¯Êý¶ÔÓ¦µ½³£ÓõIJÙ×÷·ûÉÏ£¬±ÈÈ磺
__cmp__(self, other)£º¶¨ÒåÁËËùÓбȽϲÙ×÷·ûµÄÐÐΪ¡£Ó¦¸ÃÔÚ self < other
ʱ·µ»ØÒ»¸ö¸ºÕûÊý£¬ÔÚ self == other ʱ·µ»Ø0£¬ÔÚ self > other ʱ·µ»ØÕýÕûÊý¡£
__eq__(self, other)£º¶¨ÒåµÈÓÚ²Ù×÷·û(==)µÄÐÐΪ¡£
__ne__(self, other)£º¶¨Òå²»µÈÓÚ²Ù×÷·û(!=)µÄÐÐΪ(¶¨ÒåÁË eq µÄÇé¿öÏÂÒ²±ØÐëÔÙ¶¨Òå
ne!)
__le__(self, other)£º¶¨ÒåСÓÚµÈÓÚ²Ù×÷·û(<)µÄÐÐΪ¡£
__ge__(self, other)£º¶¨Òå´óÓÚµÈÓÚ²Ù×÷·û(>)µÄÐÐΪ¡£
ÊýÖµ²Ù×÷·û
¾ÍÏñ¿ÉÒÔʹÓñȽϲÙ×÷·ûÀ´±È½ÏÀàµÄʵÀý£¬Ò²¿ÉÒÔ¶¨ÒåÊýÖµ²Ù×÷·ûµÄÐÐΪ¡£¿ÉÒÔ·Ö³ÉÎåÀࣺһԪ²Ù×÷·û£¬³£¼ûËãÊý²Ù×÷·û£¬·´ÉäËãÊý²Ù×÷·û£¬ÔöÇ¿¸³Öµ²Ù×÷·û£¬ºÍÀàÐÍת»»²Ù×÷·û£¬ÏÂÃæÎªÒ»Ð©Àý×Ó£º
__pos__(self) ʵÏÖÈ¡Õý²Ù×÷£¬ÀýÈç +some_object
__invert__(self) ʵÏÖÈ¡·´²Ù×÷·û ~
__add__(self, other) ʵÏÖ¼Ó·¨²Ù×÷
__sub__(self, other) ʵÏÖ¼õ·¨²Ù×÷
__radd__(self, other) ʵÏÖ·´Éä¼Ó·¨²Ù×÷
__rsub__(self, other) ʵÏÖ·´Éä¼õ·¨²Ù×÷
__floordiv__(self, other) ʵÏÖʹÓà // ²Ù×÷·ûµÄÕûÊý³ý·¨
__iadd__(self, other) ʵÏÖ¼Ó·¨¸³Öµ²Ù×÷¡£
__isub__(self, other) ʵÏÖ¼õ·¨¸³Öµ²Ù×÷¡£
__int__(self) ʵÏÖµ½intµÄÀàÐÍת»»¡£
__long__(self) ʵÏÖµ½longµÄÀàÐÍת»»
·´ÉäÔËËã·û·½·¨ºÍËüÃǵij£¼û°æ±¾×öµÄ¹¤×÷Ïàͬ£¬Ö»²»¹ýÊÇ´¦Àí½»»»Á½¸ö²Ù×÷ÊýÖ®ºóµÄÇé¿ö¡£ÀàÐÍת»»²Ù×÷·û£¬Ö÷ÒªÓÃÓÚʵÏÖÀàËÆ
float() ÕâÑùµÄÄÚ½¨ÀàÐÍת»»º¯ÊýµÄ²Ù×÷¡£
ÀàµÄ±íʾ
ʹÓÃ×Ö·û´®À´±íʾÀàÊÇÒ»¸öÏ൱ÓÐÓõÄÌØÐÔ¡£ÔÚPythonÖÐÓÐһЩÄÚ½¨·½·¨¿ÉÒÔ·µ»ØÀàµÄ±íʾ£¬Ïà¶ÔÓ¦µÄ£¬Ò²ÓÐһϵÁÐÌØÊâ·½·¨¿ÉÒÔÓÃÀ´×Ô¶¨ÒåÔÚʹÓÃÕâЩÄÚ½¨º¯ÊýʱÀàµÄÐÐΪ¡£
__str__(self) ¶¨Òå¶ÔÀàµÄʵÀýµ÷Óà str() ʱµÄÐÐΪ¡£
__repr__(self) ¶¨Òå¶ÔÀàµÄʵÀýµ÷Óà repr() ʱµÄÐÐΪ¡£ str() ºÍ repr()
×îÖ÷ÒªµÄ²î±ðÔÚÓÚ¡°Ä¿±êÓû§¡±£¬repr() µÄ×÷ÓÃÊDzúÉú»úÆ÷¿É¶ÁµÄÊä³ö(´ó²¿·ÖÇé¿öÏ£¬ÆäÊä³ö¿ÉÒÔ×÷ΪÓÐЧµÄPython´úÂë)£¬¶ø
str() Ôò²úÉúÈËÀà¿É¶ÁµÄÊä³ö¡£
__dir__(self) ¶¨Òå¶ÔÀàµÄʵÀýµ÷Óà dir() ʱµÄÐÐΪ£¬Õâ¸ö·½·¨Ó¦¸ÃÏòµ÷ÓÃÕß·µ»ØÒ»¸öÊôÐÔÁÐ±í¡£Èç¹ûÖØ¶¨ÒåÁË__getattr__
»òÕßʹÓö¯Ì¬Éú³ÉµÄÊôÐÔ£¬ÒÔʵÏÖÀàµÄ½»»¥Ê½Ê¹Óã¬ÄÇôÕâ¸ö·½·¨ÊDZز»¿ÉÉٵġ£
ÊôÐÔ¿ØÖÆ
ÔÚPythonÖУ¬ÖØÔØ__getattr__¡¢__setattr__¡¢__delattr__ºÍ__getattribute__·½·¨¿ÉÒÔÓÃÀ´¹ÜÀíÒ»¸ö×Ô¶¨ÒåÀàÖеÄÊôÐÔ·ÃÎÊ¡£ÆäÖУº
getattr·½·¨½«À¹½ØËùÓÐ䶨ÒåµÄÊôÐÔ»ñÈ¡(µ±Òª·ÃÎʵÄÊôÐÔÒѾ¶¨Òåʱ£¬¸Ã·½·¨²»»á±»µ÷Óã¬ÖÁÓÚ¶¨Òå²»¶¨Ò壬ÊÇÓÉPythonÄÜ·ñ²éÕÒµ½¸ÃÊôÐÔÀ´¾ö¶¨µÄ);
getattribute·½·¨½«À¹½ØËùÓÐÊôÐԵĻñÈ¡(²»¹Ü¸ÃÊôÐÔÊÇ·ñÒѾ¶¨Ò壬ֻҪ»ñÈ¡ËüµÄÖµ£¬¸Ã·½·¨¶¼»áµ÷ÓÃ)£¬ÓÉÓÚ´ËÇé¿ö£¬ËùÒÔ£¬µ±Ò»¸öÀàÖÐÍ¬Ê±ÖØÔØÁËgetattrºÍgetattribute·½·¨£¬ÄÇôgetattrÓÀÔ¶²»»á±»µ÷Óã¬ÁíÍâgetattribute·½·¨½ö½ö´æÔÚÓÚPython2.6µÄÐÂʽÀàºÍPython3µÄËùÓÐÀàÖÐ;
setattr·½·¨½«À¹½ØËùÓеÄÊôÐÔ¸³Öµ;
delattr·½·¨½«À¹½ØËùÓеÄÊôÐÔɾ³ý¡£
ÔÚPythonÖУ¬Ò»¸öÀà»òÀàʵÀýÖеÄÊôÐÔÊǶ¯Ì¬µÄ(ÒòΪPythonÊǶ¯Ì¬µÄ)£¬Ò²¾ÍÊÇ˵£¬¿ÉÒÔÍùÒ»¸öÀà»òÀàʵÀýÖÐÌí¼Ó»òɾ³ýÒ»¸öÊôÐÔ¡£
ÓÉÓÚgetattribute¡¢setattr¡¢delattr·½·¨¶ÔËùÓеÄÊôÐÔ½øÐÐÀ¹½Ø£¬ËùÒÔ£¬ÔÚÖØÔØËüÃÇʱ£¬²»ÄÜÔÙÏñÍù³£µÄ±àÂ룬ҪעÒâ±ÜÃâµÝ¹éµ÷ÓÃ(Èç¹û³öÏֵݹ飬Ôò»áÒýÆðËÀÑ»·);È»¶ø¶Ôgetattr·½·¨£¬ÔòûÓÐÕâô¶àµÄÏÞÖÆ¡£
ÔÚÖØÔØsetattr·½·¨Ê±£¬²»ÄÜʹÓá°self.name = value¡±¸ñʽ£¬·ñÔò£¬Ëü½«»áµ¼Öµݹéµ÷ÓöøÏÝÈëËÀÑ»·¡£ÕýÈ·µÄÓ¦¸ÃÊÇ£º
def __setattr__(self, name, value): # do-something object.__setattr__(self, name, value) # do-something |
ÆäÖеÄobject.__setattr__(self, name, value)Ò»¾ä¿ÉÒÔ»»³Éself.__dict__[name] = value;µ«Ç°ÌáÊÇ£¬±ØÐë±£Ö¤getattribute·½·¨ÖØÔØÕýÈ·(Èç¹ûÖØÔØÁËgetattribute·½·¨µÄ»°)£¬·ñÔò£¬½«ÔÚ¸³ÖµÊ±µ¼Ö´íÎó£¬ÒòΪself.dict½«Òª´¥·¢¶ÔselfËùÓÐÊôÐÔÖеÄdictÊôÐԵĻñÈ¡£¬ÕâÑù´Ó¶ø¾Í»áÒý·¢getattribute·½·¨µÄµ÷Óã¬Èç¹ûgetattribute·½·¨ÖØÔØ´íÎó£¬setattr·½·¨×ÔÈ»¶øÈ»Ò²¾Í»áʧ°Ü¡£
×Ô¶¨ÒåÐòÁÐ
ÓÐÐí¶à°ì·¨¿ÉÒÔÈà Python Àà±íÏÖµÃÏñÊÇÄÚ½¨ÐòÁÐÀàÐÍ(×ֵ䣬Ԫ×飬ÁÐ±í£¬×Ö·û´®µÈ)¡£
ÔÚPythonÖÐʵÏÖ×Ô¶¨ÒåÈÝÆ÷ÀàÐÍÐèÒªÓõ½Ò»Ð©ÐÒé¡£Ê×ÏÈ£¬²»¿É±äÈÝÆ÷ÀàÐÍÓÐÈçÏÂÐÒ飺ÏëʵÏÖÒ»¸ö²»¿É±äÈÝÆ÷£¬ÄãÐèÒª¶¨Òå__len__
ºÍ __getitem__¡£
¿É±äÈÝÆ÷µÄÐÒé³ýÁËÉÏÃæÌáµ½µÄÁ½¸ö·½·¨Ö®Í⣬»¹ÐèÒª¶¨Òå __setitem__ ºÍ __delitem__
¡£Èç¹ûÄãÏëÈÃÄãµÄ¶ÔÏó¿ÉÒÔµü´ú£¬ÄãÐèÒª¶¨Òå __iter__ £¬Õâ¸ö·½·¨·µ»ØÒ»¸öµü´úÆ÷¡£µü´úÆ÷±ØÐë×ñÊØµü´úÆ÷ÐÒ飬ÐèÒª¶¨Òå
__iter__ (·µ»ØËü×Ô¼º)ºÍ next ·½·¨¡£
ÉÏÏÂÎĹÜÀí
ÉÏÏÂÎĹÜÀíÐÒé(Context Management Protocol)°üº¬·½·¨ __enter__()
ºÍ __exit__()£¬Ö§³Ö ¸ÃÐÒéµÄ¶ÔÏóҪʵÏÖÕâÁ½¸ö·½·¨¡£
enter: ½øÈëÉÏÏÂÎĹÜÀíÆ÷µÄÔËÐÐʱÉÏÏÂÎÄ¡£Èç¹ûÖ¸¶¨ÁË as ×Ó¾äµÄ»°£¬·µ»ØÖµ¸³Öµ¸ø as ×Ó¾äÖеÄ
target¡£
exit: Í˳öÓëÉÏÏÂÎĹÜÀíÆ÷Ïà¹ØµÄÔËÐÐʱÉÏÏÂÎÄ¡£·µ»ØÒ»¸ö²¼¶ûÖµ±íʾÊÇ·ñ¶Ô·¢ÉúµÄÒì³£½øÐд¦Àí¡£
ÔÚÖ´ÐÐwithÓï¾ä°ü¹üÆðÀ´µÄ´úÂë¿é֮ǰ»áµ÷ÓÃÉÏÏÂÎĹÜÀíÆ÷µÄ enter ·½·¨£¬Ö´ÐÐÍêÓï¾äÌåÖ®ºó»áÖ´ÐÐ
exit ·½·¨¡£
with Óï¾äµÄÓï·¨¸ñʽÈçÏ£º
with context_expression [as target(s)]: with-body |
Python ¶ÔһЩÄÚ½¨¶ÔÏó½øÐиĽø£¬¼ÓÈëÁ˶ÔÉÏÏÂÎĹÜÀíÆ÷µÄÖ§³Ö£¬¿ÉÒÔÓÃÓÚ with Óï¾äÖУ¬±ÈÈç¿ÉÒÔ×Ô¶¯¹Ø±ÕÎļþ¡¢Ïß³ÌËøµÄ×Ô¶¯»ñÈ¡ºÍÊͷŵȡ£ÈçÏÂÃæÀý×Ó£º
>>> with open("etc/CS.json") as d: ...: print d <open file 'etc/CS.json', mode 'r' at 0x109344540> >>> print d <closed file 'etc/CS.json', mode 'r' at 0x109344540> >>> print dir(d) ['__class__', '__delattr__', '__doc__', '__enter__', '__exit__', ...] |
ͨ¹ýʹÓà with Óï¾ä£¬²»¹ÜÔÚ´¦ÀíÎļþ¹ý³ÌÖÐÊÇ·ñ·¢ÉúÒì³££¬¶¼Äܱ£Ö¤ with Óï¾äÖ´ÐÐÍê±ÏºóÒѾ¹Ø±ÕÁË´ò¿ªµÄÎļþ¾ä±ú¡£
|