Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
pythonÖÐÀàµÄÈ«Ãæ·ÖÎö
 
×÷ÕߣºxuelangZF À´×ÔÓÚ£º51CTO ·¢²¼ÓÚ 2016-9-18
  2196  次浏览      28
 

ÃæÏò¶ÔÏóÖØÒªµÄ¸ÅÄî¾ÍÊÇÀà(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 Óï¾äÖ´ÐÐÍê±ÏºóÒѾ­¹Ø±ÕÁË´ò¿ªµÄÎļþ¾ä±ú¡£

   
2196 ´Îä¯ÀÀ       28
 
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
 
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

androidÈË»ú½çÃæÖ¸ÄÏ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
AndroidÊÖ»ú¿ª·¢£¨¶þ£©
AndroidÊÖ»ú¿ª·¢£¨Èý£©
AndroidÊÖ»ú¿ª·¢£¨ËÄ£©
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖ̽ÌÖ
ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
ÊÖ»úÈí¼þ×Ô¶¯»¯²âÊÔÑо¿±¨¸æ

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
AndroidÓ¦Óÿª·¢
Androidϵͳ¿ª·¢
ÊÖ»úÈí¼þ²âÊÔ
ǶÈëʽÈí¼þ²âÊÔ
AndroidÈí¡¢Ó²¡¢ÔÆÕûºÏ

ÁìÏÈIT¹«Ë¾ android¿ª·¢Æ½Ì¨×î¼Ñʵ¼ù
±±¾© Android¿ª·¢¼¼Êõ½ø½×
ijÐÂÄÜÔ´ÁìÓòÆóÒµ Android¿ª·¢¼¼Êõ
ijº½Ì칫˾ Android¡¢IOSÓ¦ÓÃÈí¼þ¿ª·¢
°¢¶û¿¨ÌØ LinuxÄÚºËÇý¶¯
°¬Ä¬Éú ǶÈëʽÈí¼þ¼Ü¹¹Éè¼Æ
Î÷ÃÅ×Ó Ç¶Èëʽ¼Ü¹¹Éè¼Æ