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...