面向對象的實例方法,類方法和靜態方法

類方法和靜態方法

普通函數

class Person:
    def normal_method():
        print('normal')

Person.normal_method()
# Person().normal_method()

print(Person.__dict__)

5a0126547e36a94c94000001

  • Person.normal_method()可以,是因為這個方法只是被Person這個名詞空間管理的一個普通方法而已,normal_method()只是Person的一個屬性而已
  • Person().normal_method()不可以,由于normal_method()在定義的時候沒有指定self,所以不能完成實例對象的綁定,所以不能用
  • 雖然語法是對的,但是禁止這么寫

實例方法

class Person:
    def method(self):
        return("{}'s method".format(self))

tom = Person()
print(tom.method())

5a014bb87e36a94c94000006


類方法

class Person:
    @classmethod
    def class_method(cls):
        print('class = {0.__name__} ({0})'.format(cls))
        cls.HEIGHT = 179

Person.class_method()
print(Person.__dict__)

5a0128ae7e36a94c94000002

  • 在類定義中,使用@classmethod裝飾器修飾的方法
  • 必須至少有一個參數,且第一個參數留給cls,cls指代調用者即類對象自身
  • 不要修改cls標識符
  • 通過cls可以直接操作類的屬性
  • python的類方法,類似于C++、Java中的靜態方法

靜態方法

class Person:
    @classmethod
    def class_method(cls):
        print('class = {0.__name__} ({0})'.format(cls))
        cls.HEIGHT = 179

    @staticmethod
    def static_method():
        print(Person.HEIGHT)

Person.class_method()
Person.static_method()
print(Person.__dict__)

5a012e537e36a94c94000003

  • 在類定義中,使用@staticmethod裝飾器修飾的方法
  • 調用時,不會隱式地傳入參數
  • 靜態方法,只是表明這個方法屬于這個名詞空間

方法的調用

class Person:
    def normal_method():
        return('normal')

    def method(self):
        return("{}'s method".format(self))

    @classmethod
    def class_method(cls):
        cls.HEIGHT = 179
        return ('class = {0.__name__} ({0})'.format(cls))

    @staticmethod
    def static_method():
        return (Person.HEIGHT)

print('----類訪問-----')
print(1, Person.normal_method())
# print(2, Person.method())    # 報錯,因為沒有實例化,缺少一個參數,給一個參數就行
print(3, Person.class_method())
print(4, Person.static_method())
print(Person.__dict__, end='\n\n')

print('------實例訪問-------')
print('----tom----')
tom = Person()
# print(1,tom.normal_method())   # 報錯,多給了self參數
print(2, tom.method())
print(3, tom.class_method())
print(4, tom.static_method(), end='\n\n')

print('----jerry----')
jerry = Person()
# print(1, jerry.normal_method())
print(2, jerry.method())
print(3, jerry.class_method())
print(4, jerry.static_method())

5a0147537e36a94c94000004
5a01476d7e36a94c94000005


總結

  • 類除了實例方法,都可以調用,實例方法需要對象的實例作為第一參數
  • 實例除了普通方法,都可以調用,調用實例方法傳入實例自身,靜態方法類方法需要傳入實例的類

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/88299

(0)
nolannolan
上一篇 2017-11-11 16:04
下一篇 2017-11-12 11:23

相關推薦

  • Mairadb

    Mairadb 編譯安裝Mairadb數據 先下載mariadb的軟件包: 將軟件包解壓縮到/usr/local目錄下 ]# tar xf mariadb-5.5.32-linux-x86_64.tar.gz -C /usr/local/ 創建連接 ]# ln -sv maria…

    Linux干貨 2016-10-17
  • 路由配置

      RA和RB為linux系統,此處虛擬成為路由器,在每一臺路由器的接口上設置好ip之后開始配置路由表 ip地址配置如下: RA:eth1:192.168.100.1/24    eth0:10.1.0.1/8       主機A:10.1.0.25/8 RB: eth1:192.168.100.2…

    Linux干貨 2016-09-07
  • 理解基本權限以及特殊權限:Suid 、Sgid、Sticky以及acl

    理解基本權限以及特殊權限:Suid 、Sgid、Sticky以及acl 在Linux中特殊權限是什么?為什么要設定特殊權限?回答這個問題前,我們不妨思考為什么要設定權限? 大家知道Linux中一切皆文件。不論你是什么,在linux系統中都會被當做一個文件來看待。無論你是文本或目錄,硬件或軟件,圖片或視頻等等,統統都被當做文件來看待。所以,在linux中,文件…

    Linux干貨 2017-04-08
  • Linux 中cp 、rm和mv與inode之間的關系

    1.cp和inode          當文件不存在時,分配一個新的inode號,創建新文件;          當文件存在時,則inode號采用被覆蓋之前的目標文件的inode號。 2.rm和ino…

    2017-07-21
  • RPM及YUM工具介紹及使用(上)

    寫在前面 常見的計算機硬件平臺大致可以為分:x86、x86_64、amd64、ppc、arm、aarch64。軟件平臺,在Linux界則是指不同的Linux發行版。 Linux系統中的軟件(非源碼)由于都是在不同的硬件+軟件平臺開發編譯完成之后發布的,因此同一個軟件會區分硬件和軟件環境而有不同的軟件包。在安裝軟件時應該選擇與自己的硬件和軟件平臺一致的軟件包進…

    Linux干貨 2016-12-26
  • 22期+第一周課堂練習

    一.計算機的組成及其功能 計算機的組成及其功能結構圖      各部件的關系圖          二.按系列羅列Linux的發行版,并描述不同版本之間的聯系與區別 1.各版本邏輯結構圖 2.各版本的介紹   Redhat,應該稱為Redhat系列,包括RHEL(Redh…

    Linux干貨 2016-08-15
欧美性久久久久