程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Python-面向對象-任務一學習筆記

編輯:Python

多繼承 

      創建類和對象

        繼承單個父類

 

        繼承多個父類

 

        主程序 

類的繼承 

面向對象的編程帶來的主要好處之一是代碼的重用,實現這種重用的方法之一是通過繼承機制。

通過繼承創建的新類稱為子類派生類,被繼承的類稱為基類父類超類

繼承語法

class 派生類名(基類名)
...

 

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

  • 1、如果在子類中需要父類的構造方法就需要顯式的調用父類的構造方法,或者不重寫父類的構造方法。詳細說明可查看: python 子類繼承父類構造函數說明。
  • 2、在調用基類的方法時,需要加上基類的類名前綴,且需要帶上 self 參數變量。區別在於類中調用普通函數時並不需要帶上 self 參數
  • 3、Python 總是首先查找對應類型的方法,如果它不能在派生類中找到對應的方法,它才開始到基類中逐個查找。(先在本類中查找調用的方法,找不到才去基類中找)。

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

語法:

派生類的聲明,與他們的父類類似,繼承的基類列表跟在類名之後,如下所示:

class SubClassName (ParentClass1[, ParentClass2, ...]):
...

 多態:一種事物的多種形態

視頻學習:Python面向對象提升與收發郵件_哔哩哔哩_bilibili  P2

 

 

參考: Python中的多態如何理解?_tigerlib的博客-CSDN博客_python多態

 多態的作用:讓具有不同功能的函數可以使用相同的函數名,這樣就可以用一個函數名調用不同內容(功能)的函數。

多態的特點:

1、只關心對象的實例方法是否同名,不關心對象所屬的類型;
2、對象所屬的類之間,繼承關系可有可無;
3、多態的好處可以增加代碼的外部調用靈活度,讓代碼更加通用,兼容性比較強;
4、多態是調用方法的技巧,不會影響到類的內部設計。

多態的應用場景

1. 對象所屬的類之間沒有繼承關系
調用同一個函數fly(), 傳入不同的參數(對象),可以達成不同的功能

class Duck(object): # 鴨子類
def fly(self):
print("鴨子沿著地面飛起來了")
class Swan(object): # 天鵝類
def fly(self):
print("天鵝在空中翱翔")
class Plane(object): # 飛機類
def fly(self):
print("飛機隆隆地起飛了")
def fly(obj): # 實現飛的功能函數
obj.fly()
duck = Duck()
fly(duck)
swan = Swan()
fly(swan)
plane = Plane()
fly(plane)
===運行結果:===================================================================================
鴨子沿著地面飛起來了
天鵝在空中翱翔
飛機隆隆地起飛了

2. 對象所屬的類之間有繼承關系(應用更廣)

class gradapa(object):
def __init__(self,money):
self.money = money
def p(self):
print("this is gradapa")
class father(gradapa):
def __init__(self,money,job):
super().__init__(money)
self.job = job
def p(self):
print("this is father,我重寫了父類的方法")
class mother(gradapa):
def __init__(self, money, job):
super().__init__(money)
self.job = job
def p(self):
print("this is mother,我重寫了父類的方法")
return 100
#定義一個函數,函數調用類中的p()方法
def fc(obj):
obj.p()
gradapa1 = gradapa(3000)
father1 = father(2000,"工人")
mother1 = mother(1000,"老師")
fc(gradapa1) #這裡的多態性體現是向同一個函數,傳遞不同參數後,可以實現不同功能.
fc(father1)
print(fc(mother1))
===運行結果:===================================================================================
this is gradapa
this is father,我重寫了父類的方法
this is mother,我重寫了父類的方法
100

對象屬性與類屬性 

類屬性:用類名來調用的屬性

對象屬性:對象來調用

對象屬性的優先級高於類屬性(如果類屬性和對象屬性重名,那麼調用對象屬性)

 為對象屬性添加屬性則只對當前對象生效,對於類創建的其他對象沒有作用 

類屬性不要和對象屬性重名,因為對象屬性會屏蔽掉類屬性。但是當刪除對象屬性後,在使用時又可以顯示類屬性

文檔筆記

文檔地址:Python 面向對象 | 菜鳥教程

面向對象技術簡介

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

創建類 

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

class ClassName:
'類的幫助信息' #類文檔字符串
class_suite #類體

 

類的幫助信息可以通過ClassName.__doc__查看。

class_suite 由類成員,方法,數據屬性組成。

實例

以下是一個簡單的 Python 類的例子:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Employee:
'所有員工的基類'
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
  • empCount 變量是一個類變量,它的值將在這個類的所有實例之間共享。你可以在內部類或外部類使用 Employee.empCount 訪問。

  • 第一種方法__init__()方法是一種特殊的方法,被稱為類的構造函數或初始化方法,當創建了這個類的實例時就會調用該方法

  • self 代表類的實例,self 在定義類的方法時是必須有的,雖然在調用時不必傳入相應的參數。

self代表類的實例,而非類

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

class Test:
def prt(self):
print(self)
print(self.__class__)
t = Test()
t.prt()
----------------------------------------------------------------------------------------
運算結果
<__main__.Test instance at 0x10d066878>
__main__.Test

從執行結果可以很明顯的看出,self 代表的是類的實例,代表當前對象的地址,而 self.__class__ 則指向類。

self 不是 python 關鍵字,我們把他換成 runoob 也是可以正常執行的:

創建方法

class ClassName:
'類的幫助信息' #類文檔字符串
class_suite #類體

類的幫助信息可以通過ClassName.__doc__查看。

class_suite 由類成員,方法,數據屬性組成。

方法重寫

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

#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Parent: # 定義父類
def myMethod(self):
print '調用父類方法'
class Child(Parent): # 定義子類
def myMethod(self):
print '調用子類方法'
c = Child() # 子類實例
c.myMethod() # 子類調用重寫方法
-------------------------------------------------------------------------------------------
輸出結果
調用子類方法

基礎重載方法

 運算符重載

Python同樣支持運算符重載,實例如下:

#!/usr/bin/python
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)

創建實例對象

實例化類其他編程語言中一般用關鍵字 new,但是在 Python 中並沒有這個關鍵字,類的實例化類似函數調用方式。

以下使用類的名稱 Employee 來實例化,並通過 __init__ 方法接收參數。

"創建 Employee 類的第一個對象"
emp1 = Employee("Zara", 2000)
"創建 Employee 類的第二個對象"
emp2 = Employee("Manni", 5000)

訪問屬性

您可以使用點號 . 來訪問對象的屬性。使用如下類的名稱訪問類變量:

emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

完整實例

#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Employee:
'所有員工的基類'
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
"創建 Employee 類的第一個對象"
emp1 = Employee("Zara", 2000)
"創建 Employee 類的第二個對象"
emp2 = Employee("Manni", 5000)
emp1.displayEmployee()
emp2.displayEmployee()
print "Total Employee %d" % Employee.empCount

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

  • getattr(obj, name[, default]) : 訪問對象的屬性。
  • hasattr(obj,name) : 檢查是否存在一個屬性。
  • setattr(obj,name,value) : 設置一個屬性。如果屬性不存在,會創建一個新屬性。
  • delattr(obj, name) : 刪除屬性。
hasattr(emp1, 'age') # 如果存在 'age' 屬性返回 True。
getattr(emp1, 'age') # 返回 'age' 屬性的值
setattr(emp1, 'age', 8) # 添加屬性 'age' 值為 8
delattr(emp1, 'age') # 刪除屬性 'age'

Python內置類屬性

  • __dict__ : 類的屬性(包含一個字典,由類的數據屬性組成)
  • __doc__ :類的文檔字符串
  • __name__: 類名
  • __module__: 類定義所在的模塊(類的全名是'__main__.className',如果類位於一個導入模塊mymod中,那麼className.__module__ 等於 mymod)
  • __bases__ : 類的所有父類構成元素(包含了一個由所有父類組成的元組)

實例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Employee:
'所有員工的基類'
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
print "Employee.__doc__:", Employee.__doc__
print "Employee.__name__:", Employee.__name__
print "Employee.__module__:", Employee.__module__
print "Employee.__bases__:", Employee.__bases__
print "Employee.__dict__:", Employee.__dict__
------------------------------------------------------------------------------------------
運算結果
Employee.__doc__: 所有員工的基類
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: ()
Employee.__dict__: {'__module__': '__main__', 'displayCount': <function displayCount at 0x10a939c80>, 'empCount': 0, 'displayEmployee': <function displayEmployee at 0x10a93caa0>, '__doc__': '\xe6\x89\x80\xe6\x9c\x89\xe5\x91\x98\xe5\xb7\xa5\xe7\x9a\x84\xe5\x9f\xba\xe7\xb1\xbb', '__init__': <function __init__ at 0x10a939578>}

類屬性與方法

類的私有屬性

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

類的方法

在類的內部,使用 def 關鍵字可以為類定義一個方法,與一般函數定義不同,類方法必須包含參數 self,且為第一個參數

類的私有方法

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

實例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
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 # 報錯,實例不能訪問私有變量

Python不允許實例化的類訪問私有數據,但你可以使用 object._className__attrName( 對象名._類名__私有屬性名 )訪問屬性,參考以下實例:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
class Runoob:
__site = "www.runoob.com"
runoob = Runoob()
print runoob._Runoob__site

單下劃線、雙下劃線、頭尾雙下劃線說明:

  • __foo__: 定義的是特殊方法,一般是系統定義名字 ,類似 __init__() 之類的。

  • _foo: 以單下劃線開頭的表示的是 protected 類型的變量,即保護類型只能允許其本身與子類進行訪問,不能用於 from module import *

  • __foo: 雙下劃線的表示的是私有類型(private)的變量, 只能是允許這個類本身進行訪問了。


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved