ƵµÀÀ¸Ä¿
Ê×Ò³ > ³ÌÐò¿ª·¢ > Èí¼þ¿ª·¢ > ÆäËû > ÕýÎÄ
pythonѧϰ±Ê¼Ç ÀàµÄdescriptor
2016-09-16 09:32:34      ¸öÆÀÂÛ    À´Ô´£ºljp1919  
Êղؠ  ÎÒҪͶ¸å

descriptorÓ¦Óñ³¾°

ËùνÃèÊöÆ÷£¬ÊÇʵÏÖÁËÃèÊö·ûЭÒ飬¼´get, set, ºÍ delete·½·¨µÄ¶ÔÏó¡£
¼òµ¥Ëµ£¬ÃèÊö·û¾ÍÊÇ¿ÉÒÔÖØ¸´Ê¹ÓõÄÊôÐÔ¡£
±ÈÈçÒÔÏ´úÂ룺

f = Foo()
b = f.bar
f.bar = c
del f.bar

ÔÚ½âÊÍÆ÷Ö´ÐÐÉÏÊö´úÂëʱ£¬µ±·¢ÏÖÄãÊÔͼ·ÃÎÊÊôÐÔ£¨b = f.bar£©¡¢¶ÔÊôÐÔ¸³Öµ£¨f.bar = c£©»òÕßɾ³ýÒ»¸öʵÀý±äÁ¿µÄÊôÐÔ£¨del f.bar£©Ê±£¬¾Í»áÈ¥µ÷ÓÃ×Ô¶¨ÒåµÄ·½·¨¡£
Ϊʲô°Ñ¶Ôº¯ÊýµÄµ÷ÓÃαװ³É¶ÔÊôÐԵķÃÎÊ£¿ÓÐʲôºÃ´¦£¿

´Óproperty˵Æð

ÓÃ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µÄ²»×ã

¶Ô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Âß¼­±àдµ¥¶ÀµÄÀàÀ´´¦Àí¡£ÏÂÃæµÄʾÀýչʾÁËÃèÊö·ûÊÇÈçºÎ¹¤×÷µÄ¡£

ÒýÈëdescriptor ÃèÊö·û

ÎÒÃÇÖªµÀ×°ÊÎÆ÷ÐèÒªÓà @ ·ûºÅµ÷Ó㬵ü´úÆ÷ͨ³£ÔÚµü´ú¹ý³Ì£¬»òÕßʹÓà 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ÀàÊÇÈçºÎ¹¤×÷µÄ£¿

ÿ¸ö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_¡£Õâô×öÐв»Í¨Ò»¶¨ÊÇÓÐÔ­ÒòµÄ£©

descriptorʹÓÃÀý×Ó

Ô´ÂëÎļþ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¾ÍÊÇÀà±¾Éí¡£

´òÓ¡½á¹û£º
pythonѧϰ±Ê¼Ç ÀàµÄdescriptor
ÔÚÃèÊö·ûÀàÖУ¬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µÄÔËÐнá¹ûÈçÏ£º
pythonѧϰ±Ê¼Ç ÀàµÄdescriptor

ǰÁ½Ìõ½á¹ûºÍÉÏÃæÊÇÒ»Öµġ£
µÚÈýÌõ½á¹û²»Í¬¡£
None
ÓÉÓÚÔںܶàʱºòÃèÊö·ûÀàÖÐÈÔÈ»ÐèÒªÖªµÀµ÷ÓøÃÃèÊö·ûµÄʵÀýÊÇË­£¬ËùÒÔÔÚÃèÊö·ûÀàÖдæÔÚµÚ¶þ¸ö²ÎÊýins£¬ÓÃÀ´±íʾµ÷ÓÃËüµÄÀàʵÀý£¬ËùÒÔt.xʱ¿ÉÒÔ¿´µ½µÚÈýÐÐÖеÄÔËÐнá¹ûÖеڶþÏîΪNone£¬ÕâÊÇÒòΪTest.xÊÇÖ±½Óͨ¹ýÀàÀ´½øÐе÷Óá£ÓÉÓÚûÓÐʵÀý£¬ËùÒÔ·µ»ØNone¡£
δÍ꣬´ý²¹³ä

µã»÷¸´ÖÆÁ´½Ó ÓëºÃÓÑ·ÖÏí!»Ø±¾Õ¾Ê×Ò³
ÉÏһƪ£ºHDU 5452 Minimum Cut 2015ÉòÑôÍøÂçÈü£¨ÔÚÏßLCA£©
ÏÂһƪ£ºḬ̈߳²È«ºÍ¹²Ïí×ÊÔ´
Ïà¹ØÎÄÕÂ
ͼÎÄÍÆ¼ö

¹ØÓÚÎÒÃÇ | ÁªÏµÎÒÃÇ | ¹ã¸æ·þÎñ | Ͷ×ʺÏ×÷ | °æÈ¨ÉêÃ÷ | ÔÚÏß°ïÖú | ÍøÕ¾µØÍ¼ | ×÷Æ··¢²¼ | Vip¼¼ÊõÅàѵ | ¾Ù±¨ÖÐÐÄ

°æÈ¨ËùÓÐ: ºìºÚÁªÃË--ÖÂÁ¦ÓÚ×öʵÓõÄIT¼¼ÊõÑ§Ï°ÍøÕ¾