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

類方法和靜態方法

普通函數

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
下一篇 2017-11-12

相關推薦

  • 馬哥教育網絡班21期-第六周課程練習

    1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#;  # :%s@^[[:space:]]\+@#&@g 2、復制/boot/grub/grub.conf至/tmp目錄中,刪除/tmp/grub.conf文件中的行首的空白字符; &nb…

    Linux干貨 2016-08-15
  • 馬哥教育網絡班22期+第3周課程練習

    1、列出當前系統上所有已經登錄的用戶的用戶名,注意:同一個用戶登陸多次,則只顯示一次即可。     who | cut -d' ' -f1 | sort -u 2、取出最后登錄到當前系統的用戶的相關信息。     who | sort -t' ' -k4 | …

    Linux干貨 2016-08-29
  • fstab配置文件詳解

    /etc/fstab配置文件詳解 /etc/fstab:記錄了計算機上硬盤分區的相關信息,啟動Linux時,檢查分區的fsck命令,掛載分區的mount命令,都需要fstab這個文件的信息,來正確的檢查和掛載硬盤,而且這個硬盤需要root用戶權限才能編輯 詳解: 設備名稱   掛載點  分區的類型  掛載選項  dump選項  fsck選項 設備名稱: 可以…

    Linux干貨 2017-04-23
  • Linux第九周總結

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; #!/bin/bash # login_user=0 nologin_user=0 for i in $(cat /etc/passwd | cut -d : -f 7);do &nbsp…

    Linux干貨 2017-08-28
  • 搭建一套LVS-DR模型的高性能集群(LVS-DR+Nginx+Mariadb+Nfs+php-fpm+wordpress)

    架構簡介 參加馬哥linux培訓一周了,自己感覺每天都進步很多,現在來說說這個架構,也是架構師第一周的作業第二題。搭建一套LVS-DR模型的高性能集群,做了兩天終于完成并實現了這個架構,我設計的架構圖如下所示: 此架構主要是用ipvsadm來實現高性能集群,Realserver(RS1,RS2)安裝配置nginx,RS服務器分別配置了一個內網,一個外網。正?!?/p>

    Linux干貨 2016-12-06
欧美性久久久久