Learn_Python_面向對象15

之前學C++,最重要的思想就是C++是一門面向對象的語言。
學習Python也到了高階篇了。

Python面向對象

1 面向對象簡介:

  • 類(Class):用來描述具有相同的屬性和方法的對象的集合。它定義了該集合中每個對象所共有的屬性和方法。對象是類的實例
  • 類變量:類變量在整個實例化的對象中是公用的。類變量定義在類中且在函數體之外。類變量通常不作爲實例變量使用
  • 數據成員:類變量或實例變量,用於處理及其例對象的相關的數據。
  • 方法重寫:如果從父類繼承的方法不能滿足子類的需求,可以對其進行改寫,這個過程叫方法的覆蓋,也稱爲方法的重寫。
  • 局部變量:定義在方法中的變量,只作用於當前實例的類。
  • 實例變量:在類的聲明中,屬性是變量來表示的。這種變量就稱爲實例變量,是在類聲明的內部但是在類的其他成員方法之外聲明的。
  • 繼承:即一個派生類(derived class)繼承基類(bases class)的字段和方法。繼承也允許把一個派生類的對象作爲一個基類對象對待。
  • 實例化:創建一個類的實例,類的具體對象。
  • 方法:類中定義的函數。
  • 對象:通過類定義的數據結構實例。對象包括兩個數據成員(類變量和實例變量)和方法。

2 創建類

使用class語句創建一個新類,class之後爲類的名稱並以冒號結尾。

class ClassName:
	'類的幫助信息' # 類文檔字符串
	class_suite  # 類體
	# 類的幫助信息可以通過ClassName.__doc__查看
	# class_suite由類成員,方法,數據屬性組成
2.1 類對象
class test:
    i = 6
    def f(self):
        return 'hello world'
# 實例化
x = test()
# 訪問類的屬性和方法
print("test類的屬性i爲:",x.i)
print("test類的方法f輸出爲:",x.f())
test類的屬性i爲: 6
test類的方法f輸出爲: hello world

類有一個名爲 __ init __ ()的構造方法,該方法在類實例化使會自動調用。

當然,__ init __ ()的構造方法可以有參數,參數通過__ init __ ()傳遞到類的實例化操作上。

class Complex:
    def __init__(self,realpart,imagpart):
        self.r = realpart
        self.i = imagpart
x = Complex(3.0,-4.0)
print(x.r, x.i)
3.0 -4.0

self代表類的實例,而非類

類的方法與普通的函數只有一個特別的區別:它們必須有一個額外的第一個參數名稱,按照慣例它的名稱是self。

class test:
    def prt(self):
        print(self)
        print(self.__class__)
        
t = test()
t.prt()
<__main__.test object at 0x0000000004D26DA0>
<class '__main__.test'>
2.2 類的方法

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

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))
# 實例化
p = people('hugh',10,30)
p.speak()
hugh 說:我 10 歲。

3 繼承

同C++比,Python也支持類的繼承。

派生類的定義:

class DerivedClassName(BaseClassName1):
    <statement-1>
    .
    .
    .
    <statement-N>
3.1 單繼承
# 類定義
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):
    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('hugh',10,60,3)
s.speak()
hugh 說:我 10 歲了,我在讀 3 年級。
3.2 多繼承
# 類定義
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 speaker():
    topic = ''
    name = ''
    def __init__(self,n,t):
        self.name = n
        self.topic = t
    def speak(self):
        print("我叫 %s,我是一個演說家,我演講的主題是 %s" %(self.name,self.topic))

# 單繼承
class 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))
        
# 多重繼承
class sample(speaker,student):
    a = ''
    def __init__(self,n,a,w,g,t):
        student.__init__(self,n,a,w,g)
        speaker.__init__(self,n,t)
test = sample("hugh",25,80,4,"Python3")
test.speak()
我叫 hugh,我是一個演說家,我演講的主題是 Python3

4 方法重寫

如果父類方法的功能不能滿足需求,可以在子類中重寫父類的方法。

class Parent:
    def method(self):
        print('調用父類的方法')

class Child(Parent):
    def method(self):
        print('調用子類的方法')
    
c = Child()
c.method()
super(Child,c).method()
調用子類的方法
調用父類的方法

5 更多

5.1 類的私有屬性

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

5.2 類的方法

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

self 的名字並不是規定死的,也可以使用 this,但是最好還是按照約定是用 self

class Private:
    __private = 0 # 私有變量
    public = 0    # 公開變量
    
    def count(self):
        self.__private += 1
        self.public += 1
        print(self.__private)
        
counter = Private()
counter.count()
counter.count()
print(counter.public)
print(counter.__private)  # 報錯,實例不能訪問私有變量
1
2
2

---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-12-eb258bd90cce> in <module>()
     12 counter.count()
     13 print(counter.public)
---> 14 print(counter.__private)  # 報錯,實例不能訪問私有變量


AttributeError: 'Private' object has no attribute '__private'
5.3 類的私有方法

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

class Site:
    def __init__(self,name,url):
        self.name = name
        self.__url = url
        
    def who(self):
        print('name:',self.name)
        print('url:',self.__url)
        
    def __foo(self):
        print('私有方法的調用')
        
    def foo(self):
        print('公共方法的調用')
        self.__foo()
        
x = Site('CSDN個人主頁','https://me.csdn.net/MRZHUGH')
x.who()
x.foo()
x.__foo()  #報錯 ,外錯不能調用私有方法
name: CSDN個人主頁
url: https://me.csdn.net/MRZHUGH
公共方法的調用
私有方法的調用

---------------------------------------------------------------------------

AttributeError                            Traceback (most recent call last)

<ipython-input-14-ac3466031d2a> in <module>()
     18 x.who()
     19 x.foo()
---> 20 x.__foo()  #報錯 ,外錯不能調用私有方法


AttributeError: 'Site' object has no attribute '__foo'
5.4 類的專有方法:
  • __ init __: 構造函數,在生成對象時調用
  • __ del __: 析構函數,釋放對象時使用
  • __ repr __: 打印,轉換
  • __ setitem __:按照索引賦值
  • __ getitem __:按照索引獲取值
  • __ len __: 獲得長度
  • __ cmp __: 比較運算
  • __ call __: 函數調用
  • __ add __: 加運算
  • __ sub __: 減運算
  • __ mul __: 乘運算
  • __ truediv __: 除運算
  • __ mod __: 求餘運算
  • __ pow __: 乘方

參考引用:

革命尚未成功,同志仍需努力!

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