首頁 > 軟體

python之class類和方法的用法詳解

2023-03-29 06:01:23

類和方法的概念和範例

  • 類(Class):用來描述具有相同的屬性和方法的物件的集合。它定義了該集合中每個物件所共有的屬性和方法。物件是類的範例。
  • 方法:類中定義的函數。
  • 類的構造方法__init__():類有一個名為 init() 的特殊方法(構造方法),該方法在類範例化時會自動呼叫。
  • 範例變數:在類的宣告中,屬性是用變數來表示的,這種變數就稱為範例變數,範例變數就是一個用 self 修飾的變數。
  • 範例化:建立一個類的範例,類的具體物件。
  • 繼承:即一個派生類(derived class)繼承基礎類別(base class)的欄位和方法。繼承也允許把一個派生類的物件作為一個基礎類別物件對待。例如,有這樣一個設計:一個Dog型別的物件派生自Animal類,這是模擬"是一個(is-a)"關係(例圖,Dog是一個Animal)。

 1.python類:class

python的class(類)相當於一個多個函陣列成的家族,如果在這個Myclass大家族裡有一個人叫f,假如這個f具有print天氣的作用,那麼如果有一天我需要這個f來print一下今天的天氣,那麼我必須叫他的全名MyClass.f才可以讓他給我print,即在呼叫他的時候需要帶上他的家族名稱+他的名稱。

  • 屬性:屬性就是在這個類裡的變數。如果變數是物品,那麼不同的屬性就是這個大家族裡不同的物品
  • 方法:方法就是在這個類裡的函數。如果函數是人,那麼不同的方法就是這個大家族裡不同的人。

 MyClass範例:

#Myclass家族,但是這個家族只有一個人f
class MyClass:   
  """一個簡單的類範例"""    
  i = 12345    
  def f(self):        
    return 'hello world'
# 範例化類
x = MyClass() 
# 存取類的屬性和方法
print("MyClass 類的屬性 i 為:", x.i) #家族x + 物品名i
print("MyClass 類的方法 f 輸出為:", x.f()) #家族x + 人名f

輸出結果:

2.類的構造方法__init__()

假如init()也是人,但是他是家族和外界聯絡員,當外界的人想呼叫自己家族的人,就必須要先告訴他,所以只要家族的人被呼叫,那麼init()就會被先執行,然後由他去告訴那個被呼叫的人,執行被呼叫的。

init()範例:

class Complex:
    def __init__(self, realpart, imagpart): #必須要有一個self引數,
        self.r = realpart
        self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i)   # 輸出結果:3.0 -4.5

輸出結果:

3.類中方法的引數self

​​​​​在類的內部,使用 def 關鍵字來定義一個方法,與一般函數定義不同,類方法必須包含引數self, 且為第一個引數,self代表的是類的範例。

  • self:類的方法與普通的函數只有一個特別的區別——必須有一個額外的第一個引數名稱, 按照慣例它的名稱是self。
  • 類的範例:是將類應用在範例場景之中,比如有個類裡的函數是f,假如這個f具有print某一時刻的天氣狀況的能力,那麼如果我需要這個f來print一下今天12點的天氣,那麼讓他列印今天12點的天氣這個動作,就是類的範例化,讓類中的函數具有的能力變成真實的動作。

範例化範例

#類定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無法直接進行存取
    #定義構造方法
    def __init__(self,n,a):
        self.name = n
        self.age = a
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))

# 範例化類
p = people('Python',10,30)
p.speak()

輸出結果:

4.繼承

假如有兩個家族,有一個家族A開始沒落了,另一個新興的家族B想繼承A家族的物資和傭人,那麼就可以通過如下的方式實現繼承,在這裡,家族A即是父類別,家族B是子類。在用法上,如果B家族可以任意使用A家族的物品和傭人。

class [子類]([父類別]):
  • BaseClassName(範例中的基礎類別名)必須與派生類定義在一個作用域內。除了類,還可以用表示式,基礎類別定義在另一個模組中時這一點非常有用。
  • python還支援多繼承,即可以繼承多個父類別。繼承方式和單繼承方式一樣,方式如下:
class [子類]([父類別]1, [父類別]2, [父類別]3):

繼承範例:

#類定義
class people:
    #定義基本屬性
    name = ''
    age = 0
    #定義私有屬性,私有屬性在類外部無法直接進行存取
    __weight = 0
    #定義構造方法
    def __init__(self,n,a,w):
        self.name = n
        self.age = a
        self.__weight = w
    def speak(self):
        print("%s 說: 我 %d 歲。" %(self.name,self.age))

#單繼承範例
class student(people): #student為子類,people為父類別
    grade = ''
    def __init__(self,n,a,w,g):
        #呼叫父類別的構函
        people.__init__(self,n,a,w)
        self.grade = g
    #覆寫父類別的方法
    def speak(self):
        print("%s 說: 我 %d 歲了,我在讀 %d 年級"%(self.name,self.age,self.grade))

s = student('ken',10,60,3)
s.speak()

執行結果:

5.方法重寫

如果你的父類別方法的功能不能滿足你的需求,你可以在子類重寫你父類別的方法。即如果B家族繼承了A家族,但是B家族有個傭人只會掃地,於是A家族給這個人洗腦,讓他啥都不會,然後再教這個傭人洗碗、擦桌子的技能,那麼這個傭人就只會洗碗和擦桌子了。

  • super()函數是用於呼叫父類別(超類)的一個方法。

 方法重寫範例:

class Parent:        # 定義父類別
   def myMethod(self):
      print('呼叫父類別方法')

class Child(Parent): # 定義子類
   def myMethod(self):
      print('呼叫子類方法')

c = Child()          # 子類範例
c.myMethod()         # 子類呼叫重寫方法
super(Child,c).myMethod() #用子類物件呼叫父類別已被覆蓋的方法

輸出結果:

類的特殊屬性與方法

類的私有屬性

  • _private_attrs:兩個下劃線開頭,宣告該屬性為私有,不能在類的外部被使用或直接存取。在類內部的方法中使用時 self.__private_attrs。

 私有屬性範例:

class JustCounter:
    __secretCount = 0  # 私有變數
    publicCount = 0    # 公開變數

    def count(self):
        self.__secretCount += 1
        self.publicCount += 1
        print(self.__secretCount)

counter = JustCounter()
counter.count()
counter.count()
print(counter.publicCount)
print(counter.__secretCount)  # 報錯,範例不能存取私有變數

輸出結果:

類的私有方法

  • __private_method:兩個下劃線開頭,宣告該方法為私有方法,只能在類的內部呼叫 ,不能在類的外部呼叫。self.__private_methods。

 私有方法範例:

class Site:
    def __init__(self, name, url):
        self.name = name       # public
        self.__url = url   # private

    def who(self):
        print('name  : ', self.name)
        print('url : ', self.__url)

    def __foo(self):          # 私有方法
        print('這是私有方法')

    def foo(self):            # 公共方法
        print('這是公共方法')
        self.__foo()

x = Site('Python', 'www.irvingao.com')
x.who()        # 正常輸出
x.foo()        # 正常輸出
x.__foo()      # 報錯

輸出結果:

到此這篇關於python之class類和方法的用法詳解的文章就介紹到這了,更多相關class類和方法的用法內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com