Python學習筆記|Python之物件導向

Tester_hope發表於2018-12-21

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.nameself.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_genderset_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)

當子類沒有重寫父類的方法時,呼叫的是父類的,重寫了則呼叫自己的方法

相關文章