1. 程式人生 > 實用技巧 >面向物件--類方法和靜態方法

面向物件--類方法和靜態方法

靜態方法和類方法

1. 類方法

是類物件所擁有的方法,需要用修飾器@classmethod來標識其為類方法,對於類方法,第一個引數必須是類物件,一般以cls作為第一個引數(當然可以用其他名稱的變數作為其第一個引數,但是大部分人都習慣以'cls'作為第一個引數的名字,就最好用'cls'了),能夠通過例項物件和類物件去訪問。

class People(object):
    # 私有類屬性
    __country = 'china'

    #類方法,用classmethod來進行修飾
    @classmethod
    def get_country(cls):
        return cls.__country

p = People()
print(p.get_country())    #可以用過例項物件引用
print(People.get_country())    #可以通過類物件引用

類方法還有一個用途就是可以對類屬性進行修改:

class People(object):
    # 私有類屬性
    __country = 'china'

    #類方法,用classmethod來進行修飾
    @classmethod
    def get_country(cls):
        return cls.__country

    @classmethod
    def set_country(cls,country):
        cls.__country = country


p = People()
print(p.get_country())   #可以用過例項物件訪問
print(People.get_country())    #可以通過類訪問

p.set_country('japan')   

print(p.get_country())
print(People.get_country())

結果顯示在用類方法對類屬性修改之後,通過類物件和例項物件訪問都發生了改變

2. 靜態方法

需要通過修飾器@staticmethod來進行修飾,靜態方法不需要多定義引數,可以通過物件和類來訪問。

class People(object):
    country = 'china'

    @staticmethod
    #靜態方法
    def get_country():
        return People.country


p = People()
# 通過物件訪問靜態方法
p.get_contry()

# 通過類訪問靜態方法
print(People.get_country())

總結

  1. 從類方法和例項方法以及靜態方法的定義形式就可以看出來,類方法的第一個引數是類物件cls,那麼通過cls引用的必定是類物件的屬性和方法;
  2. 例項方法的第一個引數是例項物件self,那麼通過self引用的可能是類屬性、也有可能是例項屬性(這個需要具體分析),不過在存在相同名稱的類屬性和例項屬性的情況下,例項屬性優先順序更高。
  3. 靜態方法中不需要額外定義引數,因此在靜態方法中引用類屬性的話,必須通過類例項物件來引用