python的類

__init__()

類有一個名爲__init__()的特殊方法(構造方法),該方法在類實例化時會被自動調用;

當然,__init__()方法也可以有參數,參數通過__init__()傳遞到類的實例化操作上,例如:

class Complex:
    def __init__(self, realpart, imagpart):
        self.r = realpart
        self.i = imagpart
x = Complex(3.0, -4.5)
print(x.r, x.i)   # 輸出結果:3.0 -4.5

self 

self代表類的實例,代表當前對象的地址,self.__class__則指向對應的類

類的方法普通函數只有一個區別——它們必須有一個額外的第一個參數名稱,按照慣例是self(當然self不是python關鍵字,可以是任意名稱)。例如:

class Test:
    def prt(self):
        print(self)
        print(self.__class__)
 
t = Test()
t.prt()

#輸出爲
<__main__.Test instance at 0x100771878>
__main__.Test

super()函數用於調用父類(超類)的一個方法

class Parent:        # 定義父類
   def myMethod(self):
      print ('調用父類方法')
 
class Child(Parent): # 定義子類
   def myMethod(self):
      print ('調用子類方法')
 
c = Child()          # 子類實例
c.myMethod()         # 子類調用重寫方法
super(Child,c).myMethod() #用子類對象調用父類已被覆蓋的方法

#輸出
調用子類方法
調用父類方法

類的屬性(變量)和方法

  • 屬性:類中的變量
  • 私有屬性:以兩個下劃線開頭的屬性,表明該屬性爲私有,不能在類的外部被使用或直接訪問,在類內部的方法中可以被訪問
  • 類的方法:在類的內部定義的函數,且必須包含參數self(可以爲其它)
  • 類的私有方法:以兩個下劃線開頭的方法,只能在類的內部調用(self.__private_methods),不能在類的外部調用
  • 類的私有屬性實例如下:
  • 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)  # 報錯,實例不能訪問私有變量
    
    #輸出
    1
    2
    2
    Traceback (most recent call last):
      File "test.py", line 16, in <module>
        print (counter.__secretCount)  # 報錯,實例不能訪問私有變量
    AttributeError: 'JustCounter' object has no attribute '__secretCount'
  • 類的私有方法實例如下:
  • 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('菜鳥教程', 'www.runoob.com')
    x.who()        # 正常輸出
    x.foo()        # 正常輸出
    x.__foo()      # 報錯
    輸出結果: 
  •  

類的專有方法 

  • __init__:構造函數,在生成對象時調用
  • __del__:析構函數,釋放對象時使用
  • __str__:
  • __repr__:打印,轉換
  • __stitem__:按照索引[]賦值
  • __getitem__:按照索引[]獲取值
  • __len__:獲取長度
  • __cmp__:比較運算
  • __call__:函數調用
  • __add__:加運算
  • __sub__:減運算
  • __mul__:乘運算
  • __truediv__:除運算
  • __mod__:求餘運算
  • __pow__:乘方運算

針對__str__專有方法的直觀例子:

class people:
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def __str__(self):
        return '這個人的名字是%s,已經有%d歲了!'%(self.name,self.age)

a=people('孫悟空',999)
print(a)

#輸出
這個人的名字是孫悟空,已經有999歲了!

#如果沒有重載__str__運算符則會輸出:
如果沒有重載函數的話輸出的就是一串看不懂的字符串:
<__main__.people object at 0x00000272A730D278>

python同樣支持運算符重載,

如對專有方法 __add__重載

class Vector:
   def __init__(self, a, b):
      self.a = a
      self.b = b
 
   def __str__(self):
      return 'Vector (%d, %d)' % (self.a, self.b)
   
   def __add__(self,other):
      return Vector(self.a + other.a, self.b + other.b)
 
v1 = Vector(2,10)
v2 = Vector(5,-2)
print (v1 + v2)

#輸出
Vector(7,8)

類的方法總結

  • 普通方法:只能被對象調用, 默認有個self參數。
  • 靜態方法: 類和對象訪問。用 @staticmethod 裝飾的不帶 self 參數的方法叫做靜態方法,類的靜態方法可以沒有參數,可以直接使用類名調用。
  • 類方法: 類和對象訪問。默認有個 cls 參數,需要加上 @classmethod 裝飾器。
  • 私有方法:類和對象都無法訪問。兩個下劃線開頭,只能類內部訪問。
  • 多繼承情況下:從左到右查找父類的方法,找到爲止,不然就拋出異常

實例:

class Classname:
    @staticmethod
    def fun():
        print('靜態方法')

    @classmethod
    def a(cls):
        print('類方法')

    # 普通方法
    def b(self):
        print('普通方法')

    #私有方法
    def __f(self):
        print('私有方法')



Classname.fun()
Classname.a()

C = Classname()
C.fun()
C.a()
C.b()
C.__f()  #出錯

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章