python基礎 13 物件導向2

2021-09-29 00:24:55 字數 4800 閱讀 1772

定義乙個類物件,並將其實例化。對不同的例項物件,我們可以手動定義不同的屬性值

class person:

def speak(self):

print("你好,我是%s" %self.name)

p1 = person()

p2 = person()

p3 = person()

p1.name = '鋼鐵俠'

p2.name = '蜘蛛俠'

p1.speak()

p2.speak()

p3.speak()

在person這個類中,每個物件都必須定義name這個屬性且每個物件的屬性值都不一樣,需要手動新增好幾個物件的name屬性,較為麻煩;

當忘記新增某個物件的name屬性而直接呼叫speak方法時,python並不會提示錯誤,但執行時卻報錯

有什麼方法可以解決以上兩個問題呢?

特殊方法簡介

特殊方法以雙下劃線開頭,以雙下劃線結束的方法__***__

特殊方法不需要自己呼叫,會在特殊的時候有直譯器自動呼叫

學習特殊方法的方式

特殊方法什麼時候呼叫

特殊方法有什麼作用

__init__方法簡介

__init__方法在例項物件建立時自動呼叫

__init__方法會向例項物件初始化屬性

例項物件的建立流程

p1 = person()

a.建立了乙個變數p1

b.建立了乙個例項物件

c.執行類中**塊中的**,只在類中執行一次

d.呼叫 __init__方法

class person:

def __init__(self,name):

# self指的就是當前所建立的例項物件本身

#name為該函式的乙個形參,通過傳參來初始化當前的屬性,屬性名也為name

self.name = name #self.name 就相當於 p1(或者p2,p3).name

def speak(self):

print("你好,我是%s" %self.name)

p1 = person('鋼鐵俠') #'鋼鐵俠'是name這個形參的實參

p2 = person('蜘蛛俠')

p3 = person('綠巨人')

p1.speak()

p2.speak()

p3.speak()

class 類名([父類]):

公共屬性...

def __init__(self,形參1,形參2....):

self.屬性名1 = 形參1

self.屬性名2 = 形參2..

.#公共方法

def 函式名(self,形參1,形參2,...):

**塊

定義乙個簡單的類

定義乙個汽車的類

屬性:名字、顏色

方法:跑、喇叭

class car():

def __init__(self,name,color):

self.name = name

self.color = color

def run(self):

print('%s%s跑的真快' %(self.color,self.name))

def horn(self):

print('嘀嘀嘀嘀....')

c1 = car('賓士','白色')

c2 = car('寶馬','紅色')

c1.run()

c1.horn()

c2.run()

c2.horn()

向上述**中手動設定c1.name = 『賓利』,則c1的name屬性值由賓士變成了賓利,資料的安全性無法保證

如何提高資料的安全性:

1.物件的屬性不能隨意更改(修改更改時可以修改,不需要更改時不可以變動)

2.屬性不能改為任意值

我們可以對屬性進行封裝從而提高資料的安全性

封裝是物件導向的三大特性之一

封裝指的是隱藏物件中一些不希望被外部訪問到的屬性或方法

我們可以將物件的屬性名修改為外部不知道的名字,從而隱藏物件的屬性

class dog():

def __init__(self,name):

self.hidden_name = name

def speak(self):

d1 = dog('哈士奇')

#print(d1.name)

d1.hidden_name = '薩摩耶' #也可以這麼修改,但一般不會這麼做

d1.speak()

我們在進行封裝時,還需要對外界暴露一些功能使外界可以訪問和修改某些需要修改的屬性或方法

class dog():

def __init__(self,name,age):

self.hidden_name = name

self.hidden_age = age

def speak(self):

def get_name(self):

return self.hidden_name

def get_age(self):

return self.hidden_age

def set_name(self,name):

self.hidden_name = name

def set_age(self,age):

if age > 0:

self.hidden_age = age

d1 = dog('哈士奇',5)

# print(d1.name)

d1.speak()

d1.set_name('薩摩耶')

print(d1.get_name())

d1.set_age(10)

print(d1.get_age())

d1.speak()

get_name()方法訪問物件的某些隱藏屬性,set_name()方法修改物件的某些隱藏屬性(方法名可以任意設定)

使用封裝增加了程式的複雜性,但一定程度保證了資料的安全性

隱藏了物件的屬性,使呼叫者無法隨意修改物件中的屬性

增加了get和set方法,可以很好的控制程式是否是唯讀的

如果希望程式是唯讀的,可以去掉set方法

如果希望程式中的屬性不可以被訪問,可以去掉get方法

set方法設定屬性,可以增加資料的驗證,確保資料值是合法的

可以在讀取屬性和設定屬性時做一些其他的操作

我們可以使用雙下劃線+屬性名(__***)來隱藏物件的屬性

通過雙下劃線+屬性名所隱藏的物件屬性只能在類內部訪問,無法在外部訪問

隱藏屬性是python自動為隱藏屬性所設定的屬性名

該屬性名為單下劃線+類名+雙下劃線+屬性名

該方法一般不推薦,我們通常使用_函式名來進行隱藏

class person():

def __init__(self,name):

self.__name = name

def speak(self):

def get_name(self):

return self.__name

def set_name(self,name):

self.__name = name

p1 = person('鋼鐵俠')

# print(p1.__name) #報錯,無法訪問該隱藏屬性

# p1.__name = '蜘蛛俠' #報錯,無法修改該隱藏屬性

p1.speak()

property裝飾器可以將乙個方法偽裝成屬性。簡單來說,就是可以通過呼叫屬性的方法來呼叫方法

被property裝飾後的方法,不能帶除了self外的任何引數

哪個方法需要被修飾,只需要在該方法前新增property即可

class person():

def __init__(self,name):

self.__name = name

def speak(self):

@property

def get_name(self):

return self.__name

def set_name(self,name):

self.__name = name

p1 = person('鋼鐵俠')

print(p1.name)

p1.speak()

通關property裝飾後的方法本質上還是乙個方法,無法用屬性賦值的方法來修改該屬性,我們可以用name.setter裝飾器來裝飾被property裝飾後的方法,使其可以向屬性一樣通過賦值來修改

class person():

def __init__(self,name):

self._name = name

def speak(self):

@property

def name(self):

print('get方法執行了')

return self._name

@name.setter

def name(self,name):

self._name = name

p1 = person('鋼鐵俠')

p2 = person('蜘蛛俠')

p1.name = 『haha』

p1.speak()

python 基礎學習 13 物件導向一

3.類的定義 4.引數self 面向過程注重的是過程 1.媽媽穿衣服穿鞋出門 2.媽媽騎上電動車 3.媽媽到超市門口放好電動車 4.媽媽買西瓜 5.媽媽結賬 6.媽媽騎電動車回家 7.到家孩子吃西瓜 物件導向的程式語言,關注的是物件,而不注重過程,對於物件導向一切皆物件 物件導向注重的是結果 以上方...

Python 基礎 09 物件導向2

繼承 子類繼承父類,子類一旦繼承父類,就擁有父類中非私有的屬性和方法 繼承的格式 class 子類名 父類名 子類中的 繼承的優點 1.避免了 的重複,提高了 的重複使用率 2.擴充套件了子類的功能 class obj 1 def init self,func1,func2 self.func1 f...

Python基礎 13 物件導向及異常處理

算術運算子過載 class number def init self,num self.num num 物件出現在 左邊時會自動觸發 def add self,other print add return self.num other 物件出現在 右邊是會自動觸發 def radd self,oth...