day7 面向對象進階

来源:http://www.cnblogs.com/gengcx/archive/2017/06/01/6926369.html
-Advertisement-
Play Games

面向對象高級語法部分 通過@staticmethod裝飾器即可把其裝飾的方法變為一個靜態方法,什麼是靜態方法呢?其實不難理解,普通的方法,可以在實例化後直接調用,並且在方法里可以通過self.調用實例變數或類變數,但靜態方法是不可以訪問實例變數或類變數的,一個不能訪問實例變數和類變數的方法,其實相當 ...


    面向對象高級語法部分

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

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

    member_nums = 0
    def 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 = 12
print("before:",s1.member_nums)


s1.member_nums = 666     #是在類中重新生成一個變數

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

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

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

    類的靜態方法@staticmethon:

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

    member_nums = 0
    def 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.name)


#SchoolMember.talk()    #不能調用,類是沒有辦法訪問實例變數,只能訪問自己
s1 = SchoolMember("Alex",22,"Female")  #實例化
s1.walk()
運行結果如下:
Traceback (most recent call last):
  File "/home/zhuzhu/day7/staticmethon方法.py", line 22, in <module>
    s1.walk()
TypeError: walk() missing 1 required positional argument: 'self'

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

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

    member_nums = 0
    def 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 = 0
    def 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 = 0
    def 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 = 0
    def 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把一個方法變成一個靜態屬性

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

    member_nums = 0
    def 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)

    @property     #把類的方法變成一個屬性,調用要使用s1.walk不加括弧直接調用,稱為一個屬性
    def walk(self):
        print("%s is walking......" %self.name)


#SchoolMember.talk()    #不能調用,類是沒有辦法訪問實例變數,只能訪問自己
s1 = SchoolMember("Alex",22,"Female")  #實例化
s1.walk()
運行結果如下:
Traceback (most recent call last):
  File "/home/zhuzhu/day7/staticmethon方法.py", line 22, in <module>
    s1.walk()
TypeError: 'NoneType' object is not callable

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

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

    member_nums = 0
    def 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)

    @property     #把類的方法變成一個屬性,調用要使用s1.walk不加括弧直接調用,稱為一個屬性
    def walk(self):
        print("%s is walking......" %self.name)


#SchoolMember.talk()    #不能調用,類是沒有辦法訪問實例變數,只能訪問自己
s1 = SchoolMember("Alex",22,"Female")  #實例化
s1.walk
運行結果如下:
Alex is walking......

    上面代碼中,@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)經典類(先執行上一級的類)


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近在做一個資源對接項目,對方的介面中要求我們把文件的md5值傳過去,搜了一下找到這個方法,記錄之。 ...
  • 一、目標樣式 我們要實現上圖中的效果,需要如下的操作: 二、資源分享代碼 註:Client.Share.SendURL("URL地址") 分享文本:Client.Share.SendText("文本") 分享圖片:Client.Share.SendImage("圖片") 分享截屏:Client.Sh ...
  • 在angularjs中,想在文本框中,驗證用戶輸入的字元串是否為日期時間。剛開始時,Insus.NET想到的是正則,這隻是驗證到日期與時間的格式是否正確而已,而對於2月最後一天或是30或是31號,還是無能為力。 因此,Insus.NET想使用angularjs的自定義指令來驗證解決此問題。在ASP. ...
  • 1,這是因為用線程式控制制子窗體,刷新數據的時候會影響主窗體,因為主次窗體是以 Main man = new Main(); man.ShowDialog();形式存在 2,解決辦法: 新建公共類,Bool屬性並賦值,在需要調用刷新數據方法地方通過給刷新數據的方法套一個事件,在通過Timer 控制項結束當 ...
  • 接上一篇,眾所周知一個網站的用戶登錄是非常重要,一站式的登錄(SSO)也成了大家討論的熱點。微軟在這個Demo中,把登錄單獨拉了出來,形成了一個Service,用戶的註冊、登錄、找回密碼等都在其中進行。這套service是基於IdentityServer4開發的, 它是一套基於 .Net Core的... ...
  • 一、需求 我們在開發中經常會遇到一些枚舉,而且這些枚舉類型可能會在表單中的下拉中,或者單選按鈕中會用到等。 這樣用是沒問題的,但是用過的人都知道一個問題,就是枚舉的命名問題,當然有很多人枚舉直接中文命名,我是不推薦這種命名規則,因為實在不夠友好。 那有沒有可以不用中文命名,而且可以顯示中文的方法呢。 ...
  • 本文是利用PrintDocument定製列印單據的小例子。 涉及知識點: PrintDocument :從 Windows 窗體應用程式列印時,定義一種可重用的可發送到印表機上的對象。 PrintPreviewControl :表示 Windows 窗體應用程式列印預覽的原始預覽部分,沒有任何對話框 ...
  • Java基礎十一--多態 一、多態定義 簡單說:就是一個對象對應著不同類型. 多態在代碼中的體現: 父類或者介面的引用指向其子類的對象。 向上轉型:父類引用指向子類對象。子類的特有功能無法訪問。 向下轉型:子類引用指向父類對象。 在實際應用中,向上轉型便於代碼擴展(之前寫的代碼以後能用,只有繼承或者 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...