您好,登錄后才能下訂單哦!
property是一種特殊的屬性,訪問它會執行一個函數,然后返回值
特點:
1.執行函數時不需要obj.func()這樣調用,直接obj.func,像調用變量一樣調用函數,就可以執行一個函數
2.不能給其賦值
3.但是有@func.setter和@func.deleter裝飾器放在func上,可以實現對func的設置和刪除
例如:BMI值=體重(kg)÷身高^2(m)
class People:
def __init__(self,name,weight,height):
self.name=name
self.weight=weight
self.height=height
@property
def bmi(self):
return self.weight / (self.height**2)
p1=People('egon',75,1.85)
print(p1.bmi)
例如:圓的周長和面積
import math
class Circle:
def __init__(self,radius): #圓的半徑radius
self.radius=radius
@property
def area(self):
return math.pi * self.radius**2 #計算面積
@property
def perimeter(self):
return 2*math.pi*self.radius #計算周長
c=Circle(10)
print(c.radius)
print(c.area) #可以向訪問數據屬性一樣去訪問area,會觸發一個函數的執行,動態計算出一個值
print(c.perimeter) #同上
'''
輸出結果:
314.1592653589793
62.83185307179586
'''
"這里的area和perimeter不能被賦值"
c.area=3 #為特性area賦值
'''
拋出異常:
AttributeError: can't set attribute
'''
將一個類的函數定義為特性后,對象再去使用的時候obj.name,根本無法察覺自己的name是執行了一個函數計算出來的,這個property的使用方式遵循了統一訪問的原則
ps:面向對象的封裝有三種方式:
【public】
這種其實就是不封裝,是對外公開的
【protected】
這種封裝方式對外不公開,但對朋友(friend)或者子類(形象的說法是“兒子”,但我不知道為什么大家 不說“女兒”,就像“parent”本來是“父母”的意思,但中文都是叫“父類”)公開
【private】
這種封裝對誰都不公開
python并沒有在語法上內置public,protected,private,在Java中會把所有數據設置為私有的,然后提供set和get方法去設置和獲取,在Python中可以通過property實現
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# Author: vita
class Foo:
def __init__(self,val):
self.__NAME=val #將所有的數據屬性都隱藏起來
@property
def name(self):
return self.__NAME #obj.name訪問的是self.__NAME(這也是真實值的存放位置)
@name.setter
def name(self,value):
if not isinstance(value,str): #在設定值之前進行類型檢查
raise TypeError('%s must be str' %value)
self.__NAME=value #通過類型檢查后,將值value存放到真實的位置self.__NAME
@name.deleter
def name(self):
raise TypeError('Can not delete')
f=Foo('egen')
print(f.name)
f.name="10"
print(f.name)
結果
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
egen
10
Process finished with exit code 0
f.name=10
結果
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
Traceback (most recent call last):
File "E:/PythonProject/python-test/BasicGrammer/test.py", line 23, in <module>
f.name=10
File "E:/PythonProject/python-test/BasicGrammer/test.py", line 15, in name
raise TypeError('%s must be str' %value)
TypeError: 10 must be str
Process finished with exit code 1
del f.name
結果
E:\PythonProject\python-test\venvP3\Scripts\python.exe E:/PythonProject/python-test/BasicGrammer/test.py
Traceback (most recent call last):
File "E:/PythonProject/python-test/BasicGrammer/test.py", line 23, in <module>
del f.name
File "E:/PythonProject/python-test/BasicGrammer/test.py", line 20, in name
raise TypeError('Can not delete')
TypeError: Can not delete
Process finished with exit code 1
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。