Python基礎(chǔ)018--類的創(chuàng)建及實例化、類繼承

類的創(chuàng)建以及實例化、類繼承

  • 類的創(chuàng)建以及實例化

    • 定義:用來描述具有相同的屬性和方法的對象的集合;它定義了該集合中每個對象所共有的屬性和方法;對象是類的實例;
    • 類名通常由大寫字母打頭,這是標(biāo)準(zhǔn)的慣例;
      • eg: class BookShop(object):
    • 實例化--->創(chuàng)建一個類的實例,類的具體對象;
    • 方法:類中定義的函數(shù)
    • 對象:通過類定義的數(shù)據(jù)結(jié)構(gòu)實例;包括兩個數(shù)據(jù)成員(類變量和實例變量)和方法
    • 類變量是定義在類中函數(shù)體之外的;實例變量是定義在方法內(nèi)的變量,只作用于當(dāng)前實例的類;
    # 類的實例化
    In [3]: class Employee(object):
    ...:     empCount = 0                                        
    ...:     def __init__(self,name,salary):                     # 實例化對象
    ...:         self.name=name
    ...:         self.salary = salary
    ...:         Employee.empCount += 1
    ...:     def displayCount(self):
    ...:         print 'Total Employee %d' % Employee.empCount
    ...:     def displayEmployee(self):
    ...:         print 'Name:',self.name, 'salary:',self.salary
    ...:         
    
    In [4]: emp1 = Employee('Zara',2000)                        # 創(chuàng)建類中的一個對象
    In [5]: emp2 = Employee('Manni',5000)
    In [6]: emp1.displayEmployee()                              # 獲取這個對象的相關(guān)信息
    Name: Zara salary: 2000
    In [7]: emp2.displayEmployee()
    Name: Manni salary: 5000
    In [8]: print 'Total Employee %d' % Employee.empCount       # 獲取對象的個數(shù)
    Total Employee 2
    In [9]: emp1.age = 7                                        # 添加一個age屬性
    In [10]: emp1.displayEmployee() 
    Name: Zara salary: 2000
    In [11]: emp1.age = 8                                       # 修改這個age屬性
    In [13]: hasattr(emp1, 'age')                               # 判斷是否有這個屬性    
    Out[13]: True
    In [14]: getattr(emp1, 'age')                               # 得到一個屬性
    Out[14]: 8
    In [15]: setattr(emp2, 'age', 18)                           # 添加一個屬性
    In [16]: getattr(emp2, 'age')
    Out[16]: 18
    In [17]: delattr(emp1, 'age')                               # 刪除這個屬性
    In [18]: hasattr(emp1, 'age')
    Out[18]: False
    
    
  • _init_魔法方法在創(chuàng)建對象的時候使用,自動調(diào)用,可以在這里初始化屬性;

  • self代表類的實例且必須在第一位,self在定義類的方法時是必須有的,雖然在調(diào)用時不必傳入相應(yīng)的參數(shù);

    • self也是類方法和普通方法的一個特別的區(qū)別-->他們必須有一個額外的第一個參數(shù)名稱按照慣例應(yīng)該是self;
    • self不是python關(guān)鍵字,換成其他的也可以正常的執(zhí)行;
  • 面向?qū)ο蟮母鞣N魔法屬性

    • _init_魔法方法:這個方法在創(chuàng)建對象的時候使用,自動調(diào)用,可以在這里初始化屬性
    • _str_魔法方法:當(dāng)對象轉(zhuǎn)成字符串的時候自動調(diào)用,必須有返回值;
    • _new_魔法方法:創(chuàng)建對象,返回創(chuàng)建對象的值
      • 在_init_之前調(diào)用
      • 調(diào)用_new_,返回一個實例對象
      • 調(diào)用_init,將調(diào)用_new返回的實例對象,作為一個參數(shù)給self
  • 類繼承

    • 定義:即一個派生類(derived class)繼承基類(base class)的字段和方法;
    • 可以用issubclass來判斷一個類是不是另一個類的子類
    # 類的繼承
    In [20]: class Parent(object):
    ...:     parentAttr  = 100
    ...:     def __init__(self):
    ...:         print '調(diào)用父類構(gòu)造函數(shù)'
    ...:     def parentMethod(self):
    ...:         print '調(diào)用父類方法'
    ...:     def setAttr(self, attr):
    ...:         Parent.parentAttr = attr
    ...:     def getAttr(self):
    ...:         print "父類屬性:",Parent.parentAttr
    ...: class Child(Parent):
    ...:     def __init__(self):
    ...:         print "調(diào)用子類構(gòu)造方法"
    ...:     def childMethod(self):
    ...:         print '調(diào)用子類方法'
    ...:         
    
    In [21]: c = Child()                        # 實例化子類
    調(diào)用子類構(gòu)造方法
    In [23]: c.childMethod()                    # 調(diào)用子類方法
    調(diào)用子類方法
    In [25]: c.parentMethod()                   
    調(diào)用父類方法
    In [27]: c.setAttr(200)                     # 設(shè)置屬性
    In [28]: c.getAttr()
    父類屬性: 200
    In [33]: issubclass(Child,Parent)           # 判斷是否是父子關(guān)系
    Out[33]: True
    
    # 多重繼承
    In [38]: class P1(object):
    ...:     def foo(self):
    ...:         print 'called P1-foo()'
    ...: class P2(object):
    ...:     def foo(self):
    ...:         print 'called P2-foo()'
    ...:     def bar(self):
    ...:         print 'called P2-bar()'
    ...: class C1(P1,P2):
    ...:     def bar(self):
    ...:         print 'called C1-bar()'
    ...:         
    In [39]: c = C1()                           # 實例化子類
    In [40]: c.foo()                            # 調(diào)用父類P1中的方法,如果父類潘P1中沒有去父類P2中尋找
    called P1-foo()
    In [41]: c.bar()                            # 調(diào)用屬性時優(yōu)先調(diào)用自己的屬性,如果自己沒有再去父類中尋找
    called C1-bar()
    
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容