首頁 後端開發 Python教學 物件導向進階

物件導向進階

Jun 23, 2017 pm 02:46 PM
物件 進階 面向

    物件導向高階語法部分

##    透過@staticmethod#裝飾器即可把其裝飾的方法變成一個靜態方法,什麼是靜態方法呢?其實不難理解,普通的方法,可以在實例化後直接調用,並且在方法裡可以通過self.調用實例變量或類變量,但靜態方法是不可以訪問實例變量或類變量的,一個不能訪問實例變數和類別變數的方法,其實相當於跟類別本身已經沒什麼關係了,它與類別唯一的關聯就是需要透過類別名稱來呼叫這個方法。

class SchoolMember(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    member_nums = 0def introduce(self):
        print("My name is %s,and I am %s year old." %(self.name,self.age))

    @staticmethod
    def talk():
        print("I like to study python")class Teacher(SchoolMember):
    def __init__(self,name,age,sex,course,salary):
        super(Teacher,self).__init__(name,age,sex)
        self.course = course
        self.salary = salary

    def Teaching(self):
        print("Teacher %s is teaching %s." %(self.name,self.course))



s1 = Teacher("alex",22,"Femal","python",10000)

print("before:",s1.member_nums)
SchoolMember.member_nums = 12print("before:",s1.member_nums)


s1.member_nums = 666     #是在类中重新生成一个变量

print("after:",s1.member_nums)
SchoolMember.member_nums = 12print("after:",s1.member_nums)
登入後複製

    在上面程式碼中,member_nums是類別變量,如果直接呼叫s1.member_nums的話,呼叫的是類別裡面的值;如果s1.member_nums = 666,等於在實例裡面增加了一個新的變量,這個時候,修改類別的值的時候,是不會影響實例裡面變數的值的。上面代碼的輸出結果如下:

    before: 0  before: 12
  after: 666
  after: 666

    類別的靜態方法@staticmethon:

 SchoolMember(====  %  % %= SchoolMember(,,
登入後複製
登入後複製
登入後複製

    上面程式碼中,如果沒有@staticmethon的話,程式執行肯定沒有問題,但是當有了@staticmethod的時候,系統提示少了一個參數。如果我們把一個方法變成了一個靜態方法,那麼這個方法與實例就沒有太大的關係了。

class SchoolMember(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    member_nums = 0def introduce(self):
        print("My name is %s,and I am %s year old." %(self.name,self.age))

    @classmethod        #类方法,不能访问实例变量
    def talk(self):
        print("%s like to study python"  %SchoolMember.member_nums)

    @staticmethod        #让方法在类中剥离,与类没有关系,调用要传递参数
    def walk(self):
        print("%s is walking......" %self)


#SchoolMember.talk()    #不能调用,类是没有办法访问实例变量,只能访问自己
s1 = SchoolMember("Alex",22,"Female")  #实例化
s1.walk("alex")
登入後複製

    @staticmethod靜態方法是讓類別中的方法與類別沒有關聯,呼叫的時候要傳遞參數才能呼叫。

    類別方法

    類別方法通#過@classmethod#裝飾器實現,類別方法和普通方法的差異是, 類別方法只能存取類別變量,不能存取實例變數

class SchoolMember(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    member_nums = 0def introduce(self):
        print("My name is %s,and I am %s year old." %(self.name,self.age))

    #@classmethod        #类方法,不能访问实例变量
    def talk(self):
        print("%s like to study python"  %self.name)

SchoolMember.member_nums
#SchoolMember.talk()    #不能调用,类是没有办法访问实例变量,只能访问自己
s1 = SchoolMember("Alex",22,"Female")  #实例化
s1.talk()
登入後複製

    上面程式碼中,(1)類別是不能直接存取實例裡面的屬性的;(2)@classmethod的作用是讓程式只能存取類別中的變量,例如上面程式碼中的SchoolMember.member_nums ,這個是類別的方法,我們可以在talk中進行訪問,但是不能訪問self.name,因為@classmethod只能存取類別屬性。

   

class SchoolMember(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    member_nums = 0def introduce(self):
        print("My name is %s,and I am %s year old." %(self.name,self.age))

    @classmethod        #类方法,不能访问实例变量
    def talk(self):
        print("%s like to study python"  %self.name)

SchoolMember.member_nums
#SchoolMember.talk()    #不能调用,类是没有办法访问实例变量,只能访问自己
s1 = SchoolMember("Alex",22,"Female")  #实例化
s1.talk()

运行结果如下:
Traceback (most recent call last):
  File "/home/zhuzhu/day7/staticmethon方法.py", line 18, in <module>s1.talk()
  File "/home/zhuzhu/day7/staticmethon方法.py", line 13, in talk
    print("%s like to study python"  %self.name)
AttributeError: type object 'SchoolMember' has no attribute 'name'
登入後複製

    從上面可以看出,上面的程式碼@classmethon禁止了類別中的實例變量,只能使用類別變數。即不能使用self.name、self.age和self.sex,只能使用self.nember_nums和SchoolMember.member_nums類別的變數。如下:

class SchoolMember(object):
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

    member_nums = 0def introduce(self):
        print("My name is %s,and I am %s year old." %(self.name,self.age))

    @classmethod        #类方法,不能访问实例变量
    def talk(self):
        print("%s like to study python"  %SchoolMember.member_nums)

SchoolMember.member_nums
#SchoolMember.talk()    #不能调用,类是没有办法访问实例变量,只能访问自己
s1 = SchoolMember("Alex",22,"Female")  #实例化
s1.talk()

运行结果如下:0 like to study python
登入後複製

    屬性方法

    屬性方法的作用是透過@property把一個方法變成一個靜態屬性

 SchoolMember(====  %  % %= SchoolMember(,,
登入後複製
登入後複製
登入後複製

#     如果不添加@property的話,程式是能夠正常運作的,但是添加了@ property之後,程式運行出現錯誤,是什麼原因呢?因為@property是將類別的方法變成了類別的屬性,呼叫的時候我們只需執行s1.walk()無需添加括號即可執行,如下:##

 SchoolMember(====  %  % %= SchoolMember(,,
登入後複製
登入後複製
登入後複製
    上面程式碼中,@property是將類別的方法變成了成員的屬性,我們可以直接使用s1.walk來呼叫。

    #經典類別vs新式類別  

class A:             #经典类的写法,新式类是A(object)尽量少用经典类,都用新式类现在
    def __init__(self,name):
        self.name = name

    def f1(self):
        print("f1,搞基")class B(A):
    def __init__(self,name):
        super(B,self).__init__(name)

    # def f1(self):
    #     print("f1,来呀")class C(A):
    def __init__(self,name):
        super(C,self).__init__(name)

    #def f1(self):
        #print("f1,一起搞!")class D(B,C):
    pass

d = D("Alex")
d.f1()
登入後複製

 

    上面程式碼中,D類別繼承了B類和C類,當我們執行D類中的方法是,首先是在B類中進行查找,這個經典類和新式類別都是一樣的,如果查找不到,經典類別是去A類別中進行查找,而新式類別是去C類別中查找,實例如下:(備註:必須去2.X版本中執行才有差別,3 .X進行最佳化,B類中查找不到都去C類中查找)

    以下是經典類別和新式類別的執行順序:

########### ###   (新式類別)先執行同級的類別###########    ###############   (2)經典類別(先執行上一級的類別)######################

以上是物件導向進階的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章

倉庫:如何復興隊友
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island冒險:如何獲得巨型種子
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱門文章標籤

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

使用PHP的json_encode()函數將陣列或物件轉換為JSON字串 使用PHP的json_encode()函數將陣列或物件轉換為JSON字串 Nov 03, 2023 pm 03:30 PM

使用PHP的json_encode()函數將陣列或物件轉換為JSON字串

原始碼探針:Python 中物件是如何被呼叫的? 原始碼探針:Python 中物件是如何被呼叫的? May 11, 2023 am 11:46 AM

原始碼探針:Python 中物件是如何被呼叫的?

PHP中的Request物件是什麼? PHP中的Request物件是什麼? Feb 27, 2024 pm 09:06 PM

PHP中的Request物件是什麼?

如何將 MySQL 查詢結果陣列轉換為物件? 如何將 MySQL 查詢結果陣列轉換為物件? Apr 29, 2024 pm 01:09 PM

如何將 MySQL 查詢結果陣列轉換為物件?

使用Python的__contains__()函數定義物件的包含操作 使用Python的__contains__()函數定義物件的包含操作 Aug 22, 2023 pm 04:23 PM

使用Python的__contains__()函數定義物件的包含操作

使用Python的__le__()函數定義兩個物件的小於等於比較 使用Python的__le__()函數定義兩個物件的小於等於比較 Aug 21, 2023 pm 09:29 PM

使用Python的__le__()函數定義兩個物件的小於等於比較

數組和物件在 PHP 中的差異是什麼? 數組和物件在 PHP 中的差異是什麼? Apr 29, 2024 pm 02:39 PM

數組和物件在 PHP 中的差異是什麼?

詳解Javascript物件的5種循環遍歷方法 詳解Javascript物件的5種循環遍歷方法 Aug 04, 2022 pm 05:28 PM

詳解Javascript物件的5種循環遍歷方法

See all articles