ËùνÃèÊöÆ÷£¬ÊÇʵÏÖÁËÃèÊö·ûÐÒ飬¼´get, set, ºÍ delete·½·¨µÄ¶ÔÏó¡£
¼òµ¥Ëµ£¬ÃèÊö·û¾ÍÊÇ¿ÉÒÔÖØ¸´Ê¹ÓõÄÊôÐÔ¡£
±ÈÈçÒÔÏ´úÂ룺
f = Foo() b = f.bar f.bar = c del f.bar
ÔÚ½âÊÍÆ÷Ö´ÐÐÉÏÊö´úÂëʱ£¬µ±·¢ÏÖÄãÊÔͼ·ÃÎÊÊôÐÔ£¨b = f.bar£©¡¢¶ÔÊôÐÔ¸³Öµ£¨f.bar = c£©»òÕßɾ³ýÒ»¸öʵÀý±äÁ¿µÄÊôÐÔ£¨del f.bar£©Ê±£¬¾Í»áÈ¥µ÷ÓÃ×Ô¶¨ÒåµÄ·½·¨¡£
Ϊʲô°Ñ¶Ôº¯ÊýµÄµ÷ÓÃαװ³É¶ÔÊôÐԵķÃÎÊ£¿ÓÐʲôºÃ´¦£¿
ÓÃproperty¿ÉÒ԰Ѻ¯Êýµ÷ÓÃαװ³É¶ÔÊôÐԵķÃÎÊ¡£
¾Ù¸öÀý×Ó£¬ÄãµÄÒ»¸öMovieÀඨÒåÈçÏ£º
class Movie(object): def __init__(self, title, rating, runtime, budget, gross): self.title = title self.rating = rating self.runtime = runtime self.budget = budget self.gross = gross def profit(self): return self.gross - self.budget
¿ªÊ¼ÔÚÏîÄ¿µÄÆäËûµØ·½Ê¹ÓÃÕâ¸öÀ࣬µ«ÊÇÖ®ºóÄãÒâʶµ½£ºÈç¹û²»Ð¡ÐĸøµçÓ°´òÁ˸º·ÖÔõô°ì£¿Äã¾õµÃÕâÊÇ´íÎóµÄÐÐΪ£¬Ï£ÍûMovieÀà¿ÉÒÔ×èÖ¹Õâ¸ö´íÎó¡£ ÄãÊ×ÏÈÏëµ½µÄ°ì·¨Êǽ«MovieÀàÐÞ¸ÄΪÕâÑù£º
class Movie(object): def __init__(self, title, rating, runtime, budget, gross): self.title = title self.rating = rating self.runtime = runtime self.gross = gross if budget < 0: raise ValueError("Negative value not allowed: %s" % budget) self.budget = budget def profit(self): return self.gross - self.budget
µ«ÕâÐв»Í¨¡£ÒòΪÆäËû²¿·ÖµÄ´úÂë¶¼ÊÇÖ±½Óͨ¹ýMovie.budgetÀ´¸³ÖµµÄ——Õâ¸öÐÂÐ޸ĵÄÀàÖ»»áÔÚinit·½·¨Öв¶»ñ´íÎóµÄÊý¾Ý£¬µ«¶ÔÓÚÒѾ´æÔÚµÄÀàʵÀý¾ÍÎÞÄÜΪÁ¦ÁË¡£Èç¹ûÓÐÈËÊÔ×ÅÔËÐÐm.budget = -100£¬ÄÇôËҲû·¨×èÖ¹¡£¸ÃÔõô°ì£¿PythonµÄproperty½â¾öÁËÕâ¸öÎÊÌâ¡£
class Movie(object): def __init__(self, title, rating, runtime, budget, gross): self._budget = None self.title = title self.rating = rating self.runtime = runtime self.gross = gross self.budget = budget @property def budget(self): return self._budget @budget.setter def budget(self, value): if value < 0: raise ValueError("Negative value not allowed: %s" % value) self._budget = value def profit(self): return self.gross - self.budget m = Movie('Casablanca', 97, 102, 964000, 1300000) print m.budget # calls m.budget(), returns result try: m.budget = -100 # calls budget.setter(-100), and raises ValueError except ValueError: print "Woops. Not allowed"
´òÓ¡½á¹ûÈçÏ£º
964000
Woops. Not allowed
ÓÃ@property×°ÊÎÆ÷Ö¸¶¨ÁËÒ»¸ögetter·½·¨£¬ÓÃ@budget.setter×°ÊÎÆ÷Ö¸¶¨ÁËÒ»¸ösetter·½·¨¡£µ±ÎÒÃÇÕâô×öʱ£¬Ã¿µ±ÓÐÈËÊÔ×Å·ÃÎÊbudgetÊôÐÔ£¬Python¾Í»á×Ô¶¯µ÷ÓÃÏàÓ¦µÄgetter/setter·½·¨¡£±È·½Ëµ£¬µ±Óöµ½m.budget = valueÕâÑùµÄ´úÂëʱ¾Í»á×Ô¶¯µ÷ÓÃbudget.setter¡£
Èç¹ûûÓÐproperty£¬ÎÒÃǽ«²»µÃ²»°ÑËùÓеÄʵÀýÊôÐÔÒþ²ØÆðÀ´£¬Ìṩ´óÁ¿ÏÔʽµÄÀàËÆget_budgetºÍset_budget·½·¨¡£ÏñÕâÑù±àдÀàµÄ»°£¬Ê¹ÓÃÆðÀ´¾Í»á²»¶ÏµÄÈ¥µ÷ÓÃÕâЩgetter/setter·½·¨¡£¸üÔãµÄÊÇ£¬Èç¹ûÎÒÃDz»²ÉÓÃÕâÖÖ±àÂë·ç¸ñ£¬Ö±½Ó¶ÔʵÀýÊôÐÔ½øÐзÃÎÊ¡£ÄÇôÉÔºó¾Íû·¨ÒÔÇåÎúµÄ·½Ê½Ôö¼Ó¶Ô·Ç¸ºÊýµÄÌõ¼þ¼ì²é——ÎÒÃDz»µÃ²»ÖØÐ´´½¨set_budget·½·¨£¬È»ºóËÑË÷Õû¸ö¹¤³ÌÖеÄÔ´´úÂ룬½«m.budget = valueÕâÑùµÄ´úÂëÌæ»»Îªm.set_budget(value)¡£²ÉÓÃpropertyµÄÇé¿öÏ£¬¿ÉÒÔÓÃobject.value½øÐгÉÔ±±äÁ¿valueÖµµÄ»ñÈ¡£¬ÓÃobject.value=new_value¶Ô³ÉÔ±±äÁ¿value½øÐÐÖØÐ¸³Öµ¡£
Òò´Ë£¬propertyÈÃÎÒÃǽ«×Ô¶¨ÒåµÄ´úÂëͬ±äÁ¿µÄ·ÃÎÊ/É趨ÁªÏµÔÚÁËÒ»Æð£¬Í¬Ê±ÎªÄãµÄÀà±£³ÖÒ»¸ö¼òµ¥µÄ·ÃÎÊÊôÐԵĽӿڡ£
¶ÔpropertyÀ´Ëµ£¬×î´óµÄȱµã¾ÍÊÇËüÃDz»ÄÜÖØ¸´Ê¹Ó᣾ٸöÀý×Ó£¬¼ÙÉèÄãÏëΪrating£¬runtimeºÍgrossÕâЩ×Ö¶ÎÒ²Ìí¼Ó·Ç¸º¼ì²é¡£ÏÂÃæÊÇÐ޸ĹýµÄÐÂÀࣺ
class Movie(object): def __init__(self, title, rating, runtime, budget, gross): self._rating = None self._runtime = None self._budget = None self._gross = None self.title = title self.rating = rating self.runtime = runtime self.gross = gross self.budget = budget #nice @property def budget(self): return self._budget @budget.setter def budget(self, value): if value < 0: raise ValueError("Negative value not allowed: %s" % value) self._budget = value #ok @property def rating(self): return self._rating @rating.setter def rating(self, value): if value < 0: raise ValueError("Negative value not allowed: %s" % value) self._rating = value #uhh... @property def runtime(self): return self._runtime @runtime.setter def runtime(self, value): if value < 0: raise ValueError("Negative value not allowed: %s" % value) self._runtime = value #is this forever? @property def gross(self): return self._gross @gross.setter def gross(self, value): if value < 0: raise ValueError("Negative value not allowed: %s" % value) self._gross = value def profit(self): return self.gross - self.budget
¿ÉÒÔ¿´µ½´úÂëÔö¼ÓÁ˲»ÉÙ£¬µ«Öظ´µÄÂß¼Ò²³öÏÖÁ˲»ÉÙ¡£ËäÈ»property¿ÉÒÔÈÃÀà´ÓÍⲿ¿´ÆðÀ´½Ó¿ÚÕû½àƯÁÁ£¬µ«ÊÇÈ´×ö²»µ½ÄÚ²¿Í¬ÑùÕû½àƯÁÁ¡£ËùÒÔ£¬Õâʱºò³öÏÖÁËÃèÊö·û£¡
ÃèÊö·ûÊÇpropertyµÄÉý¼¶°æ£¬ÔÊÐíÄãÎªÖØ¸´µÄpropertyÂß¼±àдµ¥¶ÀµÄÀàÀ´´¦Àí¡£ÏÂÃæµÄʾÀýչʾÁËÃèÊö·ûÊÇÈçºÎ¹¤×÷µÄ¡£
ÎÒÃÇÖªµÀ×°ÊÎÆ÷ÐèÒªÓà @ ·ûºÅµ÷Ó㬵ü´úÆ÷ͨ³£ÔÚµü´ú¹ý³Ì£¬»òÕßʹÓà next ·½·¨µ÷Óá£ÃèÊöÆ÷Ôò±È½Ï¼òµ¥£¬·ÃÎʶÔÏóÊôÐÔµÄʱºò»áµ÷Óá£
ÏÈ¿´ÏÂÃæÀý×Ó£º
from weakref import WeakKeyDictionary class NonNegative(object): """A descriptor that forbids negative values""" def __init__(self, default): self.default = default self.data = WeakKeyDictionary() def __get__(self, instance, owner): # we get here when someone calls x.d, and d is a NonNegative instance # instance = x # owner = type(x) return self.data.get(instance, self.default) def __set__(self, instance, value): # we get here when someone calls x.d = val, and d is a NonNegative instance # instance = x # value = val if value < 0: raise ValueError("Negative value not allowed: %s" % value) self.data[instance] = value class Movie(object): #always put descriptors at the class-level rating = NonNegative(0)#ÕâÀïËù½¨Á¢µÄ4¸öÃèÊö·û£¬¿ÉÒÔÊÓΪÆÕͨµÄʵÀýÊôÐÔ£¡ runtime = NonNegative(0) budget = NonNegative(0) gross = NonNegative(0) def __init__(self, title, rating, runtime, budget, gross): self.title = title self.rating = rating self.runtime = runtime self.budget = budget self.gross = gross def profit(self): return self.gross - self.budget m = Movie('Casablanca', 97, 102, 964000, 1300000) print m.budget # calls Movie.budget.__get__(m, Movie) m.rating = 100 # calls Movie.budget.__set__(m, 100) try: m.rating = -1 # calls Movie.budget.__set__(m, -100) except ValueError: print "Woops, negative value"
´òÓ¡½á¹û£º
964000
Woops, negative value
NonNegativeÊÇÒ»¸öÃèÊö·û¶ÔÏó£¬ÒòΪËü¶¨Òå__get__£¬_set_»ò_delete_·½·¨¡£
MovieÀàÏÖÔÚ¿´ÆðÀ´·Ç³£ÇåÎú¡£ÎÒÃÇÔÚÀàµÄ²ãÃæÉÏ´´½¨ÁË4¸öÃèÊö·û£¬°ÑËüÃǵ±×öÆÕͨµÄʵÀýÊôÐÔ¡£ÏÔÈ»£¬ÃèÊö·ûÔÚÕâÀïΪÎÒÃÇ×ö·Ç¸º¼ì²é¡£
µ±½âÊÍÆ÷Óöµ½print m.bugetʱ£¬Ëü¾Í»á°Ñbudgetµ±×÷Ò»¸ö´øÓÐ_get_ ·½·¨µÄÃèÊö·û£¬µ÷ÓÃMovie.budget._get_·½·¨²¢½«·½·¨µÄ·µ»ØÖµ´òÓ¡³öÀ´£¬¶ø²»ÊÇÖ±½Ó´«µÝm.budgetÀ´´òÓ¡¡£ÕâºÍ·ÃÎÊÒ»¸öpropertyÏàËÆ£¬Python×Ô¶¯µ÷ÓÃÒ»¸ö·½·¨£¬Í¬Ê±·µ»Ø½á¹û¡£
_get_½ÓÊÕ2¸ö²ÎÊý£ºÒ»¸öÊǵãºÅ×ó±ßµÄʵÀý¶ÔÏó£¨ÔÚÕâÀ¾ÍÊÇm.budgetÖеÄm£©£¬ÁíÒ»¸öÊÇÕâ¸öʵÀýµÄÀàÐÍ£¨Movie£©¡£ÔÚһЩPythonÎĵµÖУ¬Movie±»³Æ×÷ÃèÊö·ûµÄËùÓÐÕߣ¨owner£©¡£Èç¹ûÎÒÃÇÐèÒª·ÃÎÊMovie.budget£¬Python½«»áµ÷ÓÃMovie.budget._get_(None, Movie)¡£¿ÉÒÔ¿´µ½£¬µÚÒ»¸ö²ÎÊýҪôÊÇËùÓÐÕßµÄʵÀý£¬ÒªÃ´ÊÇNone¡£ÕâЩÊäÈë²ÎÊý¿ÉÄÜ¿´ÆðÀ´ºÜ¹Ö£¬µ«ÊÇÕâÀïËüÃǸæËßÁËÄãÃèÊö·ûÊôÓÚÄĸö¶ÔÏóµÄÒ»²¿·Ö¡£µ±ÎÒÃÇ¿´µ½NonNegativeÀàµÄʵÏÖʱÕâÒ»ÇоͺÏÇéºÏÀíÁË¡£
µ±½âÊÍÆ÷¿´µ½m.rating = 100ʱ£¬Pythonʶ±ð³öratingÊÇÒ»¸ö´øÓÐset·½·¨µÄÃèÊö·û£¬ÓÚÊǾ͵÷ÓÃMovie.rating._set_(m, 100)¡£ºÍ_get_Ò»Ñù£¬_set_µÄµÚÒ»¸ö²ÎÊýÊǵãºÅ×ó±ßµÄÀàʵÀý£¨m.rating = 100ÖеÄm£©¡£µÚ¶þ¸ö²ÎÊýÊÇËù¸³µÄÖµ£¨100£©¡£
ΪÁË˵Ã÷µÄÍêÕû£¬ÕâÀïÌáÒ»ÏÂɾ³ý¡£Èç¹ûÄãµ÷ÓÃdel m.budget£¬Python¾Í»áµ÷ÓÃMovie.budget.delete(m)¡£
ÿ¸öNonNegativeµÄʵÀý¶¼Î¬»¤×ÅÒ»¸ö×ֵ䣬ÆäÖб£´æ×ÅËùÓÐÕßʵÀýºÍ¶ÔÓ¦Êý¾ÝµÄÓ³Éä¹ØÏµ¡£µ±ÎÒÃǵ÷ÓÃm.budgetʱ£¬_get_·½·¨»á²éÕÒÓëmÏà¹ØÁªµÄÊý¾Ý£¬²¢·µ»ØÕâ¸ö½á¹û£¨Èç¹ûÕâ¸öÖµ²»´æÔÚ£¬Ôò»á·µ»ØÒ»¸öĬÈÏÖµ£©¡£_set_²ÉÓõķ½Ê½Ïàͬ£¬µ«ÊÇÕâÀï»á°üº¬¶îÍâµÄ·Ç¸º¼ì²é¡£ÎÒÃÇʹÓÃWeakKeyDictionaryÀ´È¡´úÆÕͨµÄ×ÖµäÒÔ·ÀÖ¹ÄÚ´æÐ¹Â¶£¬ÒòΪÕâ¿ÉÒÔ±ÜÃâ½ö½öÒòΪËüÔÚÃèÊö·ûµÄ×ÖµäÖоÍÈÃÒ»¸öÎÞÓÃ?µÄʵÀýÒ»Ö±´æ»î×Å¡£
ʹÓÃÃèÊö·û»áÓÐÒ»µã±ðŤ¡£ÒòΪËüÃÇ×÷ÓÃÓÚÀàµÄ²ã´ÎÉÏ£¬Ã¿Ò»¸öÀàʵÀý¶¼¹²Ïíͬһ¸öÃèÊö·û¡£Õâ¾ÍÒâζ×ŶԲ»Í¬µÄʵÀý¶ÔÏó¶øÑÔ£¬ÃèÊö·û²»µÃ²»ÊÖ¶¯µØ¹ÜÀí?²»Í¬µÄ״̬£¬Í¬Ê±ÐèÒªÏÔʽµÄ½«ÀàʵÀý×÷ΪµÚÒ»¸ö²ÎÊý׼ȷ´«µÝ¸ø_get_¡¢_set_ÒÔ¼°_delete_·½·¨¡£
´ÓÕâ¸öÀý×Ó¿ÉÒÔÖ¸¶¨ÃèÊö·û¿ÉÒÔÓÃÀ´×öʲô——ËüÃÇÌṩÁËÒ»ÖÖ·½·¨½«propertyµÄÂß¼¸ôÀëµ½µ¥¶ÀµÄÀàÖÐÀ´´¦Àí¡£Èç¹ûÄã·¢ÏÖ×Ô¼ºÕýÔÚ²»Í¬µÄpropertyÖ®¼äÖØ¸´×ÅÏàͬµÄÂß¼£¬ÄÇôҲÐíÄã¿ÉÒÔ¿¼ÂÇϳ¢ÊÔÏÂÓÃÃèÊö·ûÖØ¹¹´úÂë¡£
ΪÁËÈÃÃèÊö·ûÄܹ»Õý³£¹¤×÷£¬ËüÃDZØÐ붨ÒåÔÚÀàµÄ²ã´ÎÉÏ¡£Èç¹ûÄã²»Õâô×ö£¬ÄÇôPythonÎÞ·¨×Ô¶¯ÎªÄãµ÷ÓÃ_get_ºÍ_set_·½·¨¡£
class Broken(object): y = NonNegative(5) def __init__(self): self.x = NonNegative(0) # NOT a good descriptor b = Broken() print "X is %s, Y is %s" % (b.x, b.y) X is <__main__.NonNegative object at 0x10432c250>, Y is 5
¿ÉÒÔ¿´µ½£¬·ÃÎÊÀà²ã´ÎÉϵÄÃèÊö·ûy¿ÉÒÔ×Ô¶¯µ÷ÓÃ_get_¡£µ«ÊÇ·ÃÎÊʵÀý²ã´ÎÉϵÄÃèÊö·ûxÖ»»á·µ»ØÃèÊö·û±¾Éí¡£
ÊÇʹÓÃÃèÊö·ûµÄʱºòҪȷ±£ÊµÀýµÄÊý¾ÝÖ»ÊôÓÚʵÀý±¾Éí¡£
±ÈÈçÏÂÃæµÄ´úÂ룺
class BrokenNonNegative(object): def __init__(self, default): self.value = default def __get__(self, instance, owner): return self.value def __set__(self, instance, value): if value < 0: raise ValueError("Negative value not allowed: %s" % value) self.value = value class Foo(object): bar = BrokenNonNegative(5) f = Foo() try: f.bar = -1 except ValueError: print "Caught the invalid assignment" Caught the invalid assignment
Õâô×ö¿´ÆðÀ´ËƺõÄÜÕý³£¹¤×÷¡£µ«ÕâÀïµÄÎÊÌâ¾ÍÔÚÓÚËùÓÐFooµÄʵÀý¶¼¹²ÏíÏàͬµÄbar£¬Õâ»á²úÉúһЩÁîÈËÍ´¿àµÄ½á¹û£º
class Foo(object): bar = BrokenNonNegative(5) f = Foo() g = Foo() print "f.bar is %s\ng.bar is %s" % (f.bar, g.bar) print "Setting f.bar to 10" f.bar = 10 print "f.bar is %s\ng.bar is %s" % (f.bar, g.bar) #ouch f.bar is 5 g.bar is 5 Setting f.bar to 10 f.bar is 10 g.bar is 10
Õâ¾ÍÊÇΪʲôÎÒÃÇÒªÔÚNonNegativeÖÐʹÓÃÊý¾Ý×ÖµäµÄÔÒò¡£_get_ºÍ_set_µÄµÚÒ»¸ö²ÎÊý¸æËßÎÒÃÇÐèÒª¹ØÐÄÄÄÒ»¸öʵÀý¡£NonNegativeʹÓÃÕâ¸ö²ÎÊý×÷Ϊ×ÖµäµÄkey£¬ÎªÃ¿Ò»¸öFooʵÀýµ¥¶À±£´æÒ»·ÝÊý¾Ý¡£
class Foo(object): bar = NonNegative(5) f = Foo() g = Foo() print "f.bar is %s\ng.bar is %s" % (f.bar, g.bar) print "Setting f.bar to 10" f.bar = 10 print "f.bar is %s\ng.bar is %s" % (f.bar, g.bar) #better f.bar is 5 g.bar is 5 Setting f.bar to 10 f.bar is 10 g.bar is 5
Õâ¾ÍÊÇÃèÊö·û×îÁîÈ˸е½±ðŤµÄµØ·½£¨Ì¹°×µÄ˵£¬ÎÒ²»Àí½âΪʲôPython²»ÈÃÄãÔÚʵÀýµÄ²ã´ÎÉ϶¨ÒåÃèÊö·û£¬²¢ÇÒ×ÜÊÇÐèÒª½«Êµ¼ÊµÄ´¦Àí·Ö·¢¸ø_get_ºÍ_set_¡£Õâô×öÐв»Í¨Ò»¶¨ÊÇÓÐÔÒòµÄ£©
Ô´ÂëÎļþtestriyu.py
class Desc: def __get__(self, ins, cls): print('self in Desc: %s ' % self ) print(self, ins, cls)#µ±Ç°DescµÄʵÀý,insÖµÊÇÓµÓÐÊôÐԵĶÔÏ󣬼´ÓµÓÐËüµÄ¶ÔÏó¡£ #ҪעÒâµÄÊÇ£¬Èç¹ûÊÇÖ±½ÓÓÃÀà·ÃÎÊdescriptor(±ðÏÓ†ªà£¬descriptorÊǸöÊôÐÔ£¬Ö±½ÓÓÃÀà·ÃÎÊdescriptor¾ÍÊÇÖ±½ÓÓÃÀà·ÃÎÊÀàµÄÊôÐÔ)£¬insµÄÖµÊÇNone¡£ #clsÊÇinsµÄÀàÐÍ£¬Èç¹ûÖ±½Óͨ¹ýÀà·ÃÎÊdescriptor£¬insÊÇNone£¬´Ëʱcls¾ÍÊÇÀà±¾Éí¡£ class Test: x = Desc() def prt(self): print('self in Test: %s' % self) t = Test() t.prt() t.x
selfÖ¸µÄÊǵ±Ç°Àࣨ¼´Desc£©µÄʵÀý¡£insÖµÊÇÓµÓÐÊôÐԵĶÔÏó¡£ÃèÊö·ûdescriptorÊǶÔÏóµÄÉÔ΢ÓеãÌØÊâµÄÊôÐÔ£¬ÕâÀïµÄins¾ÍÊÇÓµÓÐËüµÄ¶ÔÏó£¬Òª×¢ÒâµÄÊÇ£¬Èç¹ûÊÇÖ±½ÓÓÃÀà·ÃÎÊdescriptor(×¢Ò⣬descriptorÊǸöÊôÐÔ£¬Ö±½ÓÓÃÀà·ÃÎÊdescriptor¾ÍÊÇÖ±½ÓÓÃÀà·ÃÎÊÀàµÄÊôÐÔ)£¬insµÄÖµÊÇNone¡£clsÊÇinsµÄÀàÐÍ£¬Èç¹ûÖ±½Óͨ¹ýÀà·ÃÎÊdescriptor£¬insÊÇNone£¬´Ëʱcls¾ÍÊÇÀà±¾Éí¡£
´òÓ¡½á¹û£º
ÔÚÃèÊö·ûÀàÖУ¬selfÖ¸µÄÊÇÃèÊö·ûÀàµÄʵÀý£¬ËùÒÔµÚÒ»ÐеĽá¹û£¬Ã»ÓÐÒÉÎÊ£»µÚ¶þÐÐ
ΪʲôÔÚDescÀàÖж¨ÒåµÄself²»ÊÇÓ¦¸ÃÊǵ÷ÓÃËüµÄʵÀýtÂð£¿Ôõô±ä³ÉÁËDescÀàµÄʵÀýÁËÄØ£¿
ÕâÀïµ÷ÓõÄÊÇt.x£¬Ò²¾ÍÊÇ˵ÊÇTestÀàµÄʵÀýtµÄÊôÐÔx£¬ÓÉÓÚʵÀýtÖв¢Ã»Óж¨ÒåÊôÐÔx£¬ËùÒÔÕÒµ½ÁËÀàÊôÐÔx<†·Ÿ"/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPqOstvi4w8r00NTKxzxzdHJvbmc+w+jK9rf7yvTQ1Dwvc3Ryb25nPqOszqpEZXNjwOC1xMq1wP22+NLRo6zL+dLUtMu0prKiw7vT0LX308NUZXN0tcTIzrrOt723qKGjy/nS1KOss/bP1sHLtdq2/rrNtdrI/dDQtcS08tOhxNrI3aGjPGJyIC8+DQrG5NbQtdq2/tDQysfTydPadC54u/HIocq1wP10tcTK9NDUo6y+zbvhtffTw2dldLqvyv2jrM/I1rTQ0CBwcmludCgmbHNxdW87c2VsZiBpbiBEZXNjOiAlcyAmcnNxdW87ICUgc2VsZiAp0+++5KOstMvKsbXEc2VsZs6qyrXA/aOsy/nS1L3hufvOqjxiciAvPg0Kc2VsZiBpbiBEZXNjOiA8dGVzdHJpeXUuZGVzYyAweDAwMDAwMDAwMDMzN2EzMjA9"" at="" object="">
ÔÙÖ´ÐÐprint(self, ins, cls)£¬´ËʱµÄselfÊÇDescµÄʵÀý£¬insÊÇÓµÓÐxÊôÐԵĶÔÏó£¬ËùÒÔΪtestriyu.Test object£¬clsΪinsµÄÀàÐÍ£¬
ËùÒÔ´òÓ¡½á¹ûΪ
°Ñt.x¸ÄΪTest.xµÄÔËÐнá¹ûÈçÏ£º
ǰÁ½Ìõ½á¹ûºÍÉÏÃæÊÇÒ»Öµġ£
µÚÈýÌõ½á¹û²»Í¬¡£
ÓÉÓÚÔںܶàʱºòÃèÊö·ûÀàÖÐÈÔÈ»ÐèÒªÖªµÀµ÷ÓøÃÃèÊö·ûµÄʵÀýÊÇË£¬ËùÒÔÔÚÃèÊö·ûÀàÖдæÔÚµÚ¶þ¸ö²ÎÊýins£¬ÓÃÀ´±íʾµ÷ÓÃËüµÄÀàʵÀý£¬ËùÒÔt.xʱ¿ÉÒÔ¿´µ½µÚÈýÐÐÖеÄÔËÐнá¹ûÖеڶþÏîΪNone£¬ÕâÊÇÒòΪTest.xÊÇÖ±½Óͨ¹ýÀàÀ´½øÐе÷Óá£ÓÉÓÚûÓÐʵÀý£¬ËùÒÔ·µ»ØNone¡£
δÍ꣬´ý²¹³ä