Python Class 的例項方法/類方法/靜態方法

超級傑哥發表於2016-01-21

1. 定義

例項方法、類方法、靜態方法

class MyClass(object):

    class_name = "MyClass"  # 類屬性, 三種方法都能呼叫

    def __init__(self):
        self.instance_name = "instance_name"  # 例項屬性, 只能被例項方法呼叫
        self.class_name = "instance_class_name"

    def get_class_name_instancemethod(self):  # 例項方法, 只能通過例項呼叫
        # 例項方法可以訪問類屬性、例項屬性
        return MyClass.class_name

    @classmethod
    def get_class_name_classmethod(cls):  # 類方法, 可通過類名.方法名直接呼叫
        # 類方法可以訪問類屬性,不能訪問例項屬性
        return cls.class_name

    @staticmethod
    def get_class_name_staticmethod():  # 靜態方法, 可通過類名.方法名直接呼叫
        # 靜態方法可以訪問類屬性,不能訪問例項屬性
        return MyClass.class_name

    def instance_visit_class_attribute(self):
        # 例項屬性與類屬性重名時,self.class_name優先訪問例項屬性
        print "例項屬性與類屬性重名時,優先訪問例項屬性"
        print "self.class_name:", self.class_name
        print "MyClass.name:", MyClass.class_name

if __name__ == "__main__":
    MyClass.class_name = "MyClassNew"
    intance_class = MyClass()
    print "instance method:", intance_class.get_class_name_instancemethod()
    print "class method:", MyClass.get_class_name_classmethod()
    print "static method:", MyClass.get_class_name_staticmethod()
    intance_class.instance_visit_class_attribute()

執行效果

instance method: MyClassNew
class method: MyClassNew
static method: MyClassNew
例項屬性與類屬性重名時,優先訪問例項屬性
self.class_name: instance_class_name
MyClass.name: MyClassNew

2. 區別

  1. 例項方法

    屬於例項的方法
    只能通過例項名.方法名呼叫。
    其可以訪問類屬性、例項屬性,類方法、例項方法、靜態方法。

  2. 類方法

    屬於類類的方法
    可以通過例項名.方法名,也可以類名.方法名
    其不能訪問例項屬性和例項方法

  3. 靜態方法

    和類方法很相似,不同的時候定義時要定義(cls)引數
    可以通過例項名.方法名,也可以類名.方法名
    其不能訪問例項屬性和例項方法

3. 靜態方法與類方法

這兩者非常像,都是源於C++或JAVA中static的思想。不過我覺得,python的靜態方法是從c++和java進化時的一個不完全產物。儘量使用類方法,不使用靜態方法。

python的例項屬性、類屬性對應c++或java中的非靜態屬性和靜態屬性
python的例項方法、類方法對應c++或java中的非靜態方法和靜態方法

下面是一個類方法比靜態方法牛逼的地方

class Color(object):
    _color = (0, 0, 0);

    @classmethod
    def value(cls):
        if cls.__name__== 'Red':
            cls._color  = (255, 0, 0)

        elif cls.__name__ == 'Green':
            cls._color = (0, 255, 0)

        return cls._color

    class Red(Color):
        pass

    class Green(Color):
        pass

    class UnknownColor(Color):
        pass

red = Red()
green = Green()
xcolor = UnknownColor()

print 'red = ', red.value()
print 'green = ', green.value()
print 'xcolor =', xcolor.value()

相關文章