Python學習筆記|Python之物件導向
1.什麼是類
抽象出class類,根據class類建立例項instance,其中類是抽象的模板,例項是根據類建立的一個具體的物件
2.屬性
2.1 類屬性
- 定義
類屬性:即類變數,定義在類的內部,方法體外,如下:
class Person(object):
score = 98#類屬性
def __init__(self,name,gender):
self.name = name#例項屬性
self.__gender = gender#私有屬性
def instance_method(self):
# 例項方法中,可以訪問例項屬性,類屬性,靜態屬性
print('instance_methon:%s-%s-%d'%(self.name,self.__gender,self.score))
- 訪問
通過類名.屬性名來訪問
print(Person.score)
2.2 內建類屬性
內建類屬性:建立類後,系統就會自動建立這些屬性
person01 = person('Tom','M')
print(person01.__dict__) #會將例項物件的屬性和值通過字典的形式返回{'name':'Tom','gender':'M'}
print(person01.__doc__) #返回文件說明
print(person.__name__) #返回類名Person
print(person.__bases__) #返回父類object
2.3 例項屬性
例項化物件的時候自動呼叫構造方法
__init__
建立例項屬性並賦值
def __init__(self,name,gender):
self.name = name
self.gender = gender
people01 = Person('Tom','M')
print people01.name
以上self.name
及self.gender
為例項屬性
- 繫結例項屬性
由於python為動態語言,可以通過例項繫結資料
#例項繫結例項屬性
person01.score = 90
print(person01.score)#當例項屬性和類屬性重名時,例項屬性優先順序高,它將遮蔽掉對類屬性的訪問
以上結果為90
2.4 私有屬性
- 定義
雙下劃線定義的,外部無法訪問的,當前類的內部是可以訪問的
class Person(object):
score = 98 #類屬性
def __init__(self,name,gender):
self.name = name
self.__gender = gender#私有變數,如果要訪問,必須使用預留方法,如下get_gender及set_gender:
def get_gender(self):
return self.__gender
def set_gender(self,gender):
self.__gender = gender
print('性別為:%s'%(self.__gender))
- 訪問
通過物件名.屬性名訪問私有屬性
- note
特別注意私有屬性的訪問,使用預留方法給私有屬性,如下,若要訪問
__score
或__name
,則外部必須使用預留方法get_gender
和set_gender
3.方法
3.1 特殊方法
- 定義
python有一個特殊方法,在建立實際物件的時候會被建立,並且第一個引數必須為self,表示建立的例項本身
class Person(object):
score = 98 #類屬性
def __init__(self,name,gender):
self.name = name
self.__gender = gender
A.在__init__方法內部,就可以把各種屬性繫結到self,因為self就指向建立的例項本身。
B.在建立例項的時候,就不能傳入空的引數了,必須傳入與__init__方法匹配的引數,但self不需要傳,Python直譯器自己會把例項變數傳進去
- 訪問
不需要自己呼叫該特殊方法,在建立例項的時候自動會呼叫該方法
3.2 類方法
- 定義
通過
@classmethod
關鍵字類中定義,引數為cls具體如下:
@classmethod
def class_method(cls):
print('class_method:%d'%cls.score)
print('class_method:%d'%(self.name))#類方法無法訪問例項屬性
- 訪問
A.類方法無法訪問例項屬性
B.訪問類屬性使用cls.類屬性
C.推薦訪問類方法使用類名.類方法
如下:
Person.class_method();
3.3 靜態方法
- 定義
使用關鍵字@staticmethod定義靜態方法,無需傳遞引數
@staticmethod
def static_method():#不需要傳遞例項
print('static_method:%d'%(Person.score))
print('static_method:%d'%(self.name))#靜態方法無法訪問例項屬性
- 訪問
A.靜態方法只能訪問類屬性,不能訪問例項屬性
B.靜態方法與類方法一旦被呼叫,記憶體地址即確定。通過類呼叫和通過例項化物件呼叫的結果完全一樣
C.推薦使用類名.靜態方法訪問靜態方法
Person.static_method();
3.4 例項方法
- 定義
例項方法是在類的內部定義的,第一個引數永遠是self,指向呼叫該方法的例項本身,故__init__也可以看著是一個特殊的例項方法
class Person(object):
def __init__(self,name,gender):
self.name = name
self.__gender = gender#私有變數,如果要訪問,必須使用預留方法,如下get_gender及set_gender:
def get_gender(self):
return self.__gender
- 訪問
呼叫例項方法必須在例項上呼叫
person01 = Person('Tom','M')
person01.get_gender()
繫結例項方法,僅對當前例項有效,其他不生效
def instance_method01(self):
print('instance_method01')
#繫結例項方法
from types import MethodType
person01.instance_method01 = MethodType(instance_method01,person01)#繫結例項方法
person01.instance_method01()
instance_method01繫結在person01,對其他物件不起作用
person02 = Person('Andy','W')
person02.instance_method01()
結果:
instance_method01繫結在person01,對person02例項不起作用,報Person類沒有instance_method01方法
'Person' object has no attribute 'instance_method01'
Python中在class定義的例項方法其實際也是一個屬性,返回的是一個函式物件,如下:
print(person01.instance_method)
結果如下:
<bound method Person.instance_method of <__main__.Person object at 0x00000000020B9358>>
4.物件導向
4.1 封裝
4.2 繼承
繼承(不需要使用關鍵字extern),使用
子類(父類)
,繼承父類的方法及屬性,也可以有自己的屬性及方法
class Student(Person):
def __init__(self,name,gender,age):
super(Student,self).__init__(name,gender)#載入父類的構造方法
self.age = age#子類自己的屬性
def get_age(self):#子類自己的方法
print('age:%d'%(self.age))
def instance_method(self):#重寫父類的方法
print('Student instance_method:%d'%self.age)
- super
初始化父類,載入父類的方法,返回當前類繼承的父類
如下:
super(Student,self).__init__(name,gender)
- python支援多繼承
一個子類可以有多個父類,並一個父類也可以有多個子類
4.3 多型
- 多型(方法的重寫)
def instance_method(self):#重寫父類的方法
print('Student instance_method:%d'%self.age)
當子類沒有重寫父類的方法時,呼叫的是父類的,重寫了則呼叫自己的方法
相關文章
- Python 3 學習筆記之——物件導向Python筆記物件
- 【python 物件導向】 python物件學習筆記《1》Python物件筆記
- Python 學習筆記之類「物件導向,超類,抽象」Python筆記物件抽象
- Python 物件導向筆記Python物件筆記
- Python學習之物件導向程式設計Python物件程式設計
- Python3:物件導向程式設計學習筆記(2)Python物件程式設計筆記
- Lua學習筆記--物件導向(三)筆記物件
- Python學習筆記|Python之推導式Python筆記
- Python學習之物件導向高階程式設計Python物件程式設計
- Flutter學習筆記(8)--Dart物件導向Flutter筆記Dart物件
- js高階 物件導向 學習筆記JS物件筆記
- Ext學習筆記2-物件導向筆記物件
- python第五次筆記---物件導向Python筆記物件
- Go 筆記之物件導向Go筆記物件
- Python學習筆記 9.0 模組 與 包 與 物件導向版學員管理系統Python筆記物件
- python之成員(物件導向)Python物件
- Python物件導向之九:反射Python物件反射
- Python基礎之物件導向Python物件
- Python進階之物件導向Python物件
- python---之物件導向selfPython物件
- 草根學Python(九) 物件導向Python物件
- Python學習之路——類-物件導向程式設計Python物件程式設計
- 物件導向筆記物件筆記
- Python——物件導向Python物件
- Python 物件導向Python物件
- python物件導向Python物件
- Python學習筆記|Python之程式Python筆記
- python學習之物件導向程式設計的一些思考Python物件程式設計
- python物件導向練習題01Python物件
- Python之物件導向和麵向過程Python物件
- Python之物件導向程式設計Python物件程式設計
- Python物件導向三大特性是什麼?Python學習教程!Python物件
- Python學習筆記之序列Python筆記
- 【廖雪峰python進階筆記】物件導向程式設計Python筆記物件程式設計
- Python學習筆記|Python之yield理解Python筆記
- Python學習筆記|Python之索引迭代Python筆記索引
- Python學習筆記|Python之特殊方法Python筆記
- python物件導向一Python物件