1. 程式人生 > >面向物件之多型,property

面向物件之多型,property

多型:
同一種事物有多種狀態
多型性:
在不考慮物件具體型別的前提下直接呼叫物件下的方法
靜態多型性和動態多型性
靜態多型性:都可以進行+操作
動態多型性:不考慮物件具體型別呼叫方法
多型的好處:
①增加了程式的靈活性
②增加了程式的可擴充套件性
多型的用法
為了規範子類的方法
定了抽象類,抽象類無需實現具體的方法,但繼承了抽象類的子類必須實現抽象類的方法,否則報錯
import abc

class Foo(metaclass = abc.ABCMeta):
def run(self):
pass

class Person(Foo):
@abc.abstractmethod
def run(self):
pass

property 將類中方法偽裝成屬性
class Foo:
@property
def AAA(self):
print('get的時候執行我啊')

@AAA.setter
def AAA(self,value):
    print('set的時候執行我啊')

@AAA.deleter
def AAA(self):
    print('delete的時候執行我啊')

只有在屬性AAA定義property後才能定義AAA.setter,AAA.deleter

f1=Foo()
f1.AAA
f1.AAA='aaa'
del f1.AAA

property的原理,是一個非資料描述符,修改了get函式,呼叫屬性時返回的是該屬性名對應的繫結方法(引數為例項名)

class Lazyproperty:
def init(self,func):
self.func=func
def get(self, instance, owner):
print('這是我們自己定製的靜態屬性,r1.area實際是要執行r1.area()')
if instance is None:
return self
return self.func(instance) #此時你應該明白,到底是誰在為你做自動傳遞self的事情

class Room:
def init(self,name,width,length):
self.name=name
self.width=width
self.length=length

@Lazyproperty #area=Lazyproperty(area) 相當於定義了一個類屬性,即描述符
def area(self):
    return self.width * self.length

r1=Room('alex',1,1)
print(r1.area)