類的創(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()