python之物件導向(二)

2021-09-24 13:33:11 字數 4536 閱讀 6007

針對類物件定義的屬性 使用賦值語句在class關鍵字下可以定義類屬性

當我們定義了乙個類屬性後,這個屬性雖然歸類所有,但類的所有例項都可以訪問到,當例項並沒有該屬性,所以會繼續查詢class的該屬性

class fairy:

name='jing' #定義類屬性

print(fairy.name)

xiannv=fairy()

print(xiannv.name)

jing

jing

千萬不要對例項屬性和類屬性使用相同的名字,因為例項屬性優先順序高於類屬性。相同名稱的例項屬性將遮蔽掉類屬性

class fairy:

name='jing' #定義類屬性

def __init__(self,x):

self.name=x

print(fairy.name)

xiannv=fairy('jj')

print(xiannv.name)

jing

jj

針對類物件定義的方法 在類方法內部可以直接訪問類屬性或者呼叫其他的類方法

@classmethod

def 方法名稱(cls): ##cls表示呼叫該方法的類本身

操作

class fairy:

name='jing' #定義類屬性

@classmethod

def eat(cls):

print('%s want to eat meat' %(cls.name))

print(fairy.name)

fairy.eat()

jing

jing want to eat meat

統計建立的玩具數量

class toy(object):

# 使用賦值語句定義類屬性,記錄所有的玩具的數量

count = 0

def __init__(self,name):

self.name = name

# 讓類屬性 +1

toy.count += 1

@classmethod

def show_toy_count(cls):

print('玩具物件的數量 %d' %(cls.count))

# 建立玩具物件

# toy1 = toy('樂高')

# toy2 = toy('泰迪熊')

# 呼叫類方法

toy.show_toy_count()

如果需要在類中定義乙個方法,這個方法,既不需要訪問例項屬性也不需要呼叫例項方法;既不需要訪問類屬性也不需要呼叫類方法,這個時候就可以把這個方法封裝成靜態方法。使用@staticmethod關鍵字進行設定

class cat(object):

@staticmethod

def call():

print('喵')

# 通過 類名. 呼叫靜態方法

cat.call()

# 不需要建立物件 直接就可以呼叫

hk=cat()

hk.call()

喵喵

私有屬性:前面帶兩個下劃線表示對變數進行私有化,私有化之後的屬性屬於類內部的屬性,可以在內部進行訪問,外部無法隨便進行訪問或者修改。

私有方法:方法名稱前面帶兩個下劃線表示方法私有化,可以在內部進行呼叫,不能使用例項在外部呼叫私有化方法。

定義屬性或方法

在屬性名或者方法名前增加兩個下劃線,定義的就是私有屬性或方法

class student(object):

def __init__(self,name,score):

# 前面帶兩個下劃線表示對變數進行私有化,

# 外部不能隨便的訪問和更改

self.__name = name

self.__score = score

def get_grand(self):

print('my name is %s,my '

'grade is %d' %(self.__name,self.__score))

def get_name(self):

return self.__name

def get_score(self):

return self.__score

def set_name(self,name):

if isinstance(name,str):

self.__name = name

else:

raise valueerror('請輸入正確的名字')

def set_score(self,score):

if isinstance(score,int):

self.__score = score

else:

raise valueerror('請輸入正確的成績')

tom = student('tom',89)

# print(tom.name)

# print(tom.score)

tom.get_grand()

# print(tom._student__name)

#tom.__name = 'new name' # 這樣做只是給例項新增了__name的屬性,並不是

# 修改私有屬性變數

tom.set_name(321321)

tom.set_score(90)

print(tom.get_name())

print(tom.get_score())

設計模式:

設計模式是前人工作的總結和提煉,通常,被人們廣泛流傳的設計模式都是針對某一特定問題的成熟解決方案,使用設計模式是為了可重用**,讓**更容易被他人理解,保證**可靠性

單例設計模式:

使用__new__(cls)方法實現單例設計模式:

我們用 類名. 的方式建立物件的時候,python直譯器會幫我們做兩件事情,

1.為物件分配空間

__new__是乙個由object基類提供的內建的靜態方法,主要有兩個作用:負責給物件分配空間,並返回物件的引用給初始化方法

2.物件初始化

init(初始化方法)負責給物件初始化.

直譯器獲得物件的引用後,將引用作為第乙個引數,傳遞給__init__方法

重點在python3中,class定義的時候,如果不顯式的寫繼承object,也是會預設自動繼承object的,所以也會有__new__(cls)

也就是說在使用類名建立物件的時候,會自動的呼叫object基類中的__new__(cls)方法生成物件並返回物件的引用。

我們可以在類中對__new__(cls)方法進行重寫,使其達到效果是:如果是第一次使用該類建立物件,那就在記憶體中為物件分配記憶體空間,並且返回物件的引用,如果已經建立過物件,那就不在重新分配記憶體空間,直接返回上次建立好的記憶體空間即可。

所以需要乙個類屬性來記錄是否已經建立過物件,以及儲存第一次建立物件時分配的記憶體位址空間。

重寫__new__方法的**非常固定:

繼承自父類方法

返回父類方法呼叫_new__方法的結果

重寫__new__方法一定要return object.new(cls)

否則python的直譯器得不到分配了空間的物件引用,就不會呼叫物件的初始化方法

單例設計模式 示例:

class musicplayer(object):

instance = none

def __new__(cls, *args, **kwargs):

print('建立物件 分配空間')

# 1.建立物件的時候,new方法會被自動呼叫

#instance = object.__new__(cls)

#return instance #返回的是物件的引用

# 判斷類屬性是否是空物件

if cls.instance is none:

# 呼叫父類方法 為第乙個物件分配空間

cls.instance = object.__new__(cls)

return cls.instance

player1 = musicplayer()

player2 = musicplayer()

player3 = musicplayer()

print(player1)

print(player2)

print(player3)

建立物件 分配空間

建立物件 分配空間

建立物件 分配空間

<__main__.musicplayer object at 0x7fc6e16e5320>

<__main__.musicplayer object at 0x7fc6e16e5320>

<__main__.musicplayer object at 0x7fc6e16e5320>

python之物件導向二

什麼時候用到多型?如果我們需要用到父類的方法的時候而且要修改父類方法的時候,或者想呈現出不同的效果是就會用到多型 這裡舉個小例子 class person object def get name self print 張三 class studens person 繼承自person類 def ge...

python基礎之物件導向(二)

class myclass name 名字 def init self print 沒有找到屬性 def get name self name self.name print name p1 myclass 當p1沒有屬性時 init 方法會自動呼叫 p1.get name 封裝是物件導向的三大特性...

Python合集之物件導向 二

在python中,類表示具有相同屬性和方法的物件集合,在使用類時,需要先定義類,然後再建立類的例項,通過類的例項就可以訪問類中的屬性和方法了。在python中,類的定義使用class關鍵字來實現,語法格式如下 class classname 類的幫助資訊 statement 引數說明 classna...