物件導向下 封裝 property裝飾器 繼承

2021-10-10 20:37:46 字數 4461 閱讀 4280

2.@property裝飾器的介紹

3.類的繼承

由於我們可以直接通過物件.屬性的方式來修改屬性的值,那麼這樣就非常的不安全。python中提供了乙個私有屬性與方法,這個觀念的主要精神是類外無法直接更改類內的私有屬性,類外也無法直接呼叫私有方法,這個觀念稱之為封裝。

class car: #定義乙個car類

def __init__(self,name,color): #初始化屬性

self.name = name

self.color = color

def run(self): #定義乙個方法

print('一輛%s的%s在馬路上飛奔'%(self.color,self.name))

c=car('保時捷','紅色') #例項化類

c.run() #呼叫方法

c.name='五菱巨集光' #修改屬性

c.color='白色'

c.run()

#一輛紅色的保時捷在馬路上飛奔

#一輛白色的五菱巨集光在馬路上飛奔

為了確保類內的屬性安全,有必要限制外部無法直接獲取類內的屬性值,python對於類內的屬性增加了私有屬性的觀念,應用方式是定義時在屬性名稱前增加__(兩個底線),定義為私有屬性後,類外的程式就無法引用了。在類內部的方法中使用是self.__屬性名.

class car: #定義乙個car類

def __init__(self,name,color): #初始化屬性

self.__name = name

self.__color = color

def run(self): #定義乙個方法

print('一輛%s的%s在馬路上飛奔'%(self.__color,self.__name))

c=car('保時捷','紅色') #例項化類

c.run() #呼叫方法

c.__name='五菱巨集光' #修改屬性

c.__color='白色'

c.run()

c.name='五菱巨集光' #修改屬性

c.color='白色'

c.run()

#一輛紅色的保時捷在馬路上飛奔

#一輛紅色的保時捷在馬路上飛奔

#一輛紅色的保時捷在馬路上飛奔

既然類有私有屬性,那麼也有私有方法,它的觀念與私有屬性類似,類外的程式無法呼叫。定義方式和私有屬性相同,只要在方法前加__(兩個底線)符號即可。

class car: #定義乙個car類

def __init__(self,name,color,money): #初始化屬性

self.__name = name

self.__color = color

self.money = money

def run(self): #定義乙個方法

print('一輛%s的%s在馬路上飛奔'%(self.__color,self.__name))

def __price(self):

print('這輛車的造格是%d'%self.money)

def get_price(self):

self.__price()

c=car('保時捷','紅色',1000000) #例項化類

c.run() #呼叫方法

#c.price()

c.get_price()

#attributeerror: 'car' object has no attribute 'price'

#注釋掉c.price()後

#一輛紅色的保時捷在馬路上飛奔

#這輛車的造格是1000000

既要保護類的封裝特性,又要讓開發者可以使用「物件.屬性」的方式操作操作類屬性,python 還提供了 @property 裝飾器。通過 @property 裝飾器,可以直接通過方法名來訪問方法,不需要在方法名後新增一對「()」小括號。

@property 的語法格式如下:

@property

def 方法名(self):

**塊

class car:

def __init__(self,name,color):

self.__name = name

self.__color = color

@property

def run(self):

return self.__name

def description(self):

print('一輛%s的%s在馬路上飛奔'%(self.__color,self.__name))

c=car('特斯拉','金色')

print(c.run)

c.description()

c.name='保時捷'

print(c.run)

c.description()

#特斯拉

#一輛金色的特斯拉在馬路上飛奔

#特斯拉

#一輛金色的特斯拉在馬路上飛奔

如果要修改屬性則需要使用setter方法,語法如下

@方法.setter

def 方法(self,value):

**塊

class car:

def __init__(self,name,color):

self.__name = name

self.__color = color

@property

def run(self):

return self.__name

@run.setter

def run(self,value):

self.__name = value

def description(self):

print('一輛%s的%s在馬路上飛奔'%(self.__color,self.__name))

c=car('特斯拉','金色')

print(c.run)

c.description()

c.run='五菱巨集光'

print(c.run)

c.description()

#特斯拉

#一輛金色的特斯拉在馬路上飛奔

#五菱巨集光

#一輛金色的五菱巨集光在馬路上飛奔

在面對物件設計中類是可以繼承的,其中被繼承的類稱為父類或基類,繼承的類稱子類或者衍生類。類的繼承最大的有點是許多父類的共有方法或屬性,在子類中不用重新設計。

class baseclassname(): #先定義乙個父類

baseclass的內容

class derivedclassname(baseclassname): #子類繼承父類的公有屬性或方法

derviedclass的內容

class animal(): #定義乙個animal類

def eat(self): #定義eat方法

print("吃食物")

def sleep(self): #定義sleep方法

print('睡覺')

class dogs(animal): #dogs類繼承animal類

def action(self): #定義dog類自己的action方法

print('狗會看家')

xiao=dogs()

xiao.eat()

xiao.sleep()

xiao.action()

#吃食物

#睡覺#狗會看家

判斷乙個類是不是另外乙個類的子類。

class a():

pass

class b(a):

pass

class c(b):

pass

class d(a):

pass

print(issubclass(b,a)) #true

print(issubclass(c,a)) #true

print(issubclass(d,c)) #false

在子類中,如果有和父類同名的方法,則通過子類例項去呼叫方法時,會呼叫子類的方法而不是父類的方法,這個特點我們稱為方法的重寫。

class a(): #定義乙個animal類

def test1(self):

print('我是a類')

class b(a):

def test2(self):

print('我是b類')

class c(b):

def test3(self):

print('我是c類')

class d(c):

pass

d=d()

d.test1()

#我是a類

d.test()

#attributeerror: 'd' object has no attribute 'test'

Python 物件導向程式設計 Property屬性

一種用起來像是使用的例項屬性一樣的特殊屬性,可以對應於某個方法 class foo deffunc self pass 定義property屬性 property defprop self pass foo foo 例項化物件 foo.func 呼叫例項方法 value foo.prop 呼叫pro...

物件導向 封裝

面向過程就是分析出解決問題所需要的步驟,然後用函式把這些步驟一步一步實現,使用的時候乙個乙個依次呼叫就可以了 物件導向是把構成問題事務分解成各個物件,建立物件的目的不是為了完成乙個步驟,而是為了描敘某個事物在整個解決問題的步驟中的行為。面向過程 優點 效能比物件導向高,因為類呼叫時需要例項化,開銷比...

物件導向(封裝)

物件導向 封裝 封裝可以被認為是乙個保護屏障,防止該類的 和資料被外部類定義的 隨機訪問。如下 public class test public int getage public string getname public string getidnum public void setage in...