python3 類的屬性、方法、封裝、繼承及小實例

 

Python 類

Python中的類提供了面向對象編程的全部基本功能:類的繼承機制容許多個基類,派生類能夠覆蓋基類中的任何方法,方法中能夠調用基類中的同名方法。

對象能夠包含任意數量和類型的數據。

python類與c++類類似,提供了類的封裝,繼承、多繼承,構造函數、析構函數。

在python3中,全部類最頂層父類都是object類,與java相似,若是定義類的時候沒有寫出父類,則object類就是其直接父類。

 
類定義

類定義語法格式以下:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

類對象:建立一個類以後,能夠經過類名訪問、改變其屬性、方法

實例對象:類實例化後,可使用其屬性,能夠動態的爲實例對象添加屬性(相似javascript)而不影響類對象。

 
類的屬性

可使用點(.)來訪問對象的屬性

也可使用如下函數的方式來訪問屬性:

    getattr(obj, name[, default]) : 訪問對象的屬性

    hasattr(obj,name) : 檢查是否存在一個屬性
    setattr(obj,name,value) : 設置一個屬性。若是屬性不存在,會建立一個新屬性

    delattr(obj, name) : 刪除屬性

 

Python內置類屬性

    __dict__ : 類的屬性(包含一個字典,由類的數據屬性組成)

    __doc__ :類的文檔字符串

    __name__: 類名

    __module__: 類定義所在的模塊(類的全名是'__main__.className',若是類位於一個導入模塊mymod中,那麼className.__module__ 等於 mymod)

    __bases__ : 類的全部父類構成元素(包含了以個由全部父類組成的元組)

javascript

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class  Person:
     "Person類"
     def  __init__( self , name, age, gender):
         print ( '進入Person的初始化' )
         self .name  =  name
         self .age  =  age
         self .gender  =  gender
         print ( '離開Person的初始化' )
     def  getName( self ):
         print ( self .name)
=  Person( 'ice' 18 '男' )
print (p.name)   # ice
print (p.age)   # 18
print (p.gender)   # 男
print ( hasattr (p,  'weight' ))   # False
# 爲p添加weight屬性
p.weight  =  '70kg'
print ( hasattr (p,  'weight' ))   # True
print ( getattr (p,  'name' ))   # ice
print (p.__dict__)   # {'age': 18, 'gender': '男', 'name': 'ice'}
print (Person.__name__)   # Person
print (Person.__doc__)   # Person類
print (Person.__dict__)   # {'__doc__': 'Person類', '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__init__': <function Person.__init__ at 0x000000000284E950>, 'getName': <function Person.getName at 0x000000000284EA60>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__module__': '__main__'}
print (Person.__mro__)   # (<class '__main__.Person'>, <class 'object'>)
print (Person.__bases__)   # (<class 'object'>,)
print (Person.__module__)   # __main__


類的方法

在類地內部,使用def關鍵字能夠爲類定義一個方法,與通常函數定義不一樣,類方法必須包含參數self,且爲第一個參數。

 

類的專有方法:

    __init__ 構造函數,在生成對象時調用

    __del__ 析構函數,釋放對象時使用

    __repr__ 打印,轉換

    __setitem__按照索引賦值

    __getitem__按照索引獲取值

    __len__得到長度

    __cmp__比較運算

    __call__函數調用

    __add__加運算

    __sub__減運算

    __mul__乘運算

    __div__除運算

    __mod__求餘運算

    __pow__稱方

 

__init__()方法是一種特殊的方法,被稱爲類的構造函數或初始化方法,當建立了這個類的實例時就會調用該方法,與c++中構造函數相似。只需在自定義的類中重寫__init__()方法便可。

html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class  Person:
     def  __init__( self , name, age, gender):
         print ( '進入Person的初始化' )
         self .name  =  name
         self .age  =  age
         self .gender  =  gender
         print ( '離開Person的初始化' )
     def  getName( self ):
         print ( self .name)
# Person實例對象
=  Person( 'ice' 18 '男' )
print (p.name)
print (p.age)
print (p.gender)
p.getName()
# 進入Person的初始化
# 離開Person的初始化
# ice
# 18
# 男
# ice


析構函數 __del__ ,__del__在對象消逝的時候被調用,當對象再也不被使用時,__del__方法運行:java

方法python

  實例方法:只能經過實例調用,實例方法第一個定義的參數只能是實例自己引用c++

class Myclass:
    def foo(self):
        print(id(self),'foo')

a=Myclass()#既然是實例對象,那就要建立實例
a.foo()#輸出類裏的函數地址
print(id(a))#輸出類對象的地址

#結果地址同樣

 

        類方法:定義類方法,要使用裝飾器@classmethod,定義的第一個參數是能是類對象的引用,能夠經過類或者實例直用web

 
class Myclass:
@classmethod#類裝飾器
    def foo2(cls):
        print(id(cls),'foo2')
   #類對象,直接能夠調用,不須要實例化
print(id(Myclass),'yy')
Myclass.foo2()#直接能夠調用

 

   靜態方法:定義靜態方法使用裝飾器@staticmethod,沒有默認的必須參數,經過類和實例直接調用編程

class Myclass:
@staticmethod#靜態方法
    def foo3():
        print('foo3')

Myclass.foo3()#沒有參數
a.foo3()
#結果foo3

 

 
類的封裝

 python經過變量名命名來區分屬性和方法的訪問權限,默認權限至關於c++和java中的public

 
類的私有屬性: __private_attrs:兩個下劃線開頭,聲明該屬性爲私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時self.__private_attrs。

類的私有方法:__private_method:兩個下劃線開頭,聲明該方法爲私有方法,不能在類地外部調用。在類的內部調用 self.__private_methods

 
雖然python不容許實例化的類訪問私有數據,但可使用 object._className__attrName 訪問屬性。其實python內部私有化的實現只是將attrName屬性變爲了_className__attrName而已

app

1
2
3
4
5
6
7
8
class  Demo:
     __id  =  123456
     def  getId( self ):
         return  self .__id
temp  =  Demo()
# print(temp.__id)  # 報錯 AttributeError: 'Demo' object has no attribute '__id'
print (temp.getId())   # 123456
print (temp._Demo__id)   # 123456


類的繼承

面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是經過繼承機制。繼承徹底能夠理解成類之間的類型和子類型關係。

須要注意的地方:繼承語法 class 派生類名(基類名)://... 基類名寫做括號裏,基本類是在類定義的時候,在元組之中指明的。

在python中繼承中的一些特色:

    1:在繼承中基類的構造(__init__()方法)不會被自動調用,它須要在其派生類的構造中親自專門調用。使用super().__init__()或parentClassName.__init__()
    2:在調用基類的方法時,須要加上基類的類名前綴,且須要帶上self參數變量。區別於在類中調用普通函數時並不須要帶上self參數
    3:Python老是首先查找對應類型的方法,若是它不能在派生類中找到對應的方法,它纔開始到基類中逐個查找。(先在本類中查找調用的方法,找不到纔去基類中找)。

若是在繼承元組中列了一個以上的類,那麼它就被稱做"多重繼承" 。

語法:

派生類的聲明,與他們的父類相似,繼承的基類列表跟在類名以後。

多態

若是父類方法的功能不能知足需求,能夠在子類重寫父類的方法。實例對象調用方法時會調用其對應子類的重寫後的方法函數

 

python3.3 類與繼承 小例 
hon中的類提供了面向對象編程的全部基本功能:類的繼承機制容許多個基類,派生類能夠覆蓋基類中的任何方法,方法中能夠調用基類中的同名方法。spa

class Base:
    def __init__(self):
        self.data=[]
    def add(self,x):
        self.data.append(x)
    def addtwice(self,x):
        self.add(x)
        self.add(x)

# child extends base
class Child(Base):
    def plus(self,a,b):
        return a+b

oChild=Child()
oChild.add("str1")
oChild.add(999)
oChild.addtwice(4)
print(oChild.data)
print(oChild.plus(2,3))

 


對象能夠包含任意數量和類型的數據。

python類與c++類類似,提供了類的封裝,繼承、多繼承,構造函數、析構函數。

在python3中,全部類最頂層父類都是object類,與java相似,若是定義類的時候沒有寫出父類,則object類就是其直接父類。

 
類定義

類定義語法格式以下:

class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

類對象:建立一個類以後,能夠經過類名訪問、改變其屬性、方法

實例對象:類實例化後,可使用其屬性,能夠動態的爲實例對象添加屬性(相似javascript)而不影響類對象。

 
類的屬性

可使用點(.)來訪問對象的屬性

也可使用如下函數的方式來訪問屬性:

    getattr(obj, name[, default]) : 訪問對象的屬性

    hasattr(obj,name) : 檢查是否存在一個屬性
    setattr(obj,name,value) : 設置一個屬性。若是屬性不存在,會建立一個新屬性

    delattr(obj, name) : 刪除屬性

 

Python內置類屬性

    __dict__ : 類的屬性(包含一個字典,由類的數據屬性組成)

    __doc__ :類的文檔字符串

    __name__: 類名

    __module__: 類定義所在的模塊(類的全名是'__main__.className',若是類位於一個導入模塊mymod中,那麼className.__module__ 等於 mymod)

    __bases__ : 類的全部父類構成元素(包含了以個由全部父類組成的元組)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class  Person:
     "Person類"
     def  __init__( self , name, age, gender):
         print ( '進入Person的初始化' )
         self .name  =  name
         self .age  =  age
         self .gender  =  gender
         print ( '離開Person的初始化' )
     def  getName( self ):
         print ( self .name)
=  Person( 'ice' 18 '男' )
print (p.name)   # ice
print (p.age)   # 18
print (p.gender)   # 男
print ( hasattr (p,  'weight' ))   # False
# 爲p添加weight屬性
p.weight  =  '70kg'
print ( hasattr (p,  'weight' ))   # True
print ( getattr (p,  'name' ))   # ice
print (p.__dict__)   # {'age': 18, 'gender': '男', 'name': 'ice'}
print (Person.__name__)   # Person
print (Person.__doc__)   # Person類
print (Person.__dict__)   # {'__doc__': 'Person類', '__weakref__': <attribute '__weakref__' of 'Person' objects>, '__init__': <function Person.__init__ at 0x000000000284E950>, 'getName': <function Person.getName at 0x000000000284EA60>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__module__': '__main__'}
print (Person.__mro__)   # (<class '__main__.Person'>, <class 'object'>)
print (Person.__bases__)   # (<class 'object'>,)
print (Person.__module__)   # __main__


類的方法

在類地內部,使用def關鍵字能夠爲類定義一個方法,與通常函數定義不一樣,類方法必須包含參數self,且爲第一個參數。

 

類的專有方法:

    __init__ 構造函數,在生成對象時調用

    __del__ 析構函數,釋放對象時使用

    __repr__ 打印,轉換

    __setitem__按照索引賦值

    __getitem__按照索引獲取值

    __len__得到長度

    __cmp__比較運算

    __call__函數調用

    __add__加運算

    __sub__減運算

    __mul__乘運算

    __div__除運算

    __mod__求餘運算

    __pow__稱方

 

__init__()方法是一種特殊的方法,被稱爲類的構造函數或初始化方法,當建立了這個類的實例時就會調用該方法,與c++中構造函數相似。只需在自定義的類中重寫__init__()方法便可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class  Person:
     def  __init__( self , name, age, gender):
         print ( '進入Person的初始化' )
         self .name  =  name
         self .age  =  age
         self .gender  =  gender
         print ( '離開Person的初始化' )
     def  getName( self ):
         print ( self .name)
# Person實例對象
=  Person( 'ice' 18 '男' )
print (p.name)
print (p.age)
print (p.gender)
p.getName()
# 進入Person的初始化
# 離開Person的初始化
# ice
# 18
# 男
# ice


析構函數 __del__ ,__del__在對象消逝的時候被調用,當對象再也不被使用時,__del__方法運行:

 
類的封裝

 python經過變量名命名來區分屬性和方法的訪問權限,默認權限至關於c++和java中的public

 
類的私有屬性: __private_attrs:兩個下劃線開頭,聲明該屬性爲私有,不能在類地外部被使用或直接訪問。在類內部的方法中使用時self.__private_attrs。

類的私有方法:__private_method:兩個下劃線開頭,聲明該方法爲私有方法,不能在類地外部調用。在類的內部調用 self.__private_methods

 
雖然python不容許實例化的類訪問私有數據,但可使用 object._className__attrName 訪問屬性。其實python內部私有化的實現只是將attrName屬性變爲了_className__attrName而已

1
2
3
4
5
6
7
8
class  Demo:
     __id  =  123456
     def  getId( self ):
         return  self .__id
temp  =  Demo()
# print(temp.__id)  # 報錯 AttributeError: 'Demo' object has no attribute '__id'
print (temp.getId())   # 123456
print (temp._Demo__id)   # 123456


類的繼承

面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是經過繼承機制。繼承徹底能夠理解成類之間的類型和子類型關係。

須要注意的地方:繼承語法 class 派生類名(基類名)://... 基類名寫做括號裏,基本類是在類定義的時候,在元組之中指明的。

在python中繼承中的一些特色:

    1:在繼承中基類的構造(__init__()方法)不會被自動調用,它須要在其派生類的構造中親自專門調用。使用super().__init__()或parentClassName.__init__()
    2:在調用基類的方法時,須要加上基類的類名前綴,且須要帶上self參數變量。區別於在類中調用普通函數時並不須要帶上self參數
    3:Python老是首先查找對應類型的方法,若是它不能在派生類中找到對應的方法,它纔開始到基類中逐個查找。(先在本類中查找調用的方法,找不到纔去基類中找)。

若是在繼承元組中列了一個以上的類,那麼它就被稱做"多重繼承" 。

語法:

派生類的聲明,與他們的父類相似,繼承的基類列表跟在類名以後。

多態

若是父類方法的功能不能知足需求,能夠在子類重寫父類的方法。實例對象調用方法時會調用其對應子類的重寫後的方法

 

python3.3 類與繼承 小例 class Base:    def __init__(self):        self.data=[]    def add(self,x):        self.data.append(x)    def addtwice(self,x):        self.add(x)        self.add(x)# child extends baseclass Child(Base):    def plus(self,a,b):        return a+boChild=Child()oChild.add("str1")oChild.add(999)oChild.addtwice(4)print(oChild.data)print(oChild.plus(2,3))

相關文章
相關標籤/搜索