Python面向對象(三)
阿新 • • 發佈:2018-08-23
ttr settings sat 都是 定義 stat inf pan sub
一.綁定方法與非綁定方法
一.綁定方法:綁定給誰就應該由誰來調用,誰來調用就會將誰當作第一個參數傳入
1.綁定給對象的方法:類中定義的函數默認就是綁定給對象的
2.綁定給類的方法:為類中定義的函數加上一個裝飾器@classmethod
二.非綁定方法:既不與類綁定,又不與對象綁定,意味著對象和類都可以來調用,無論誰來調用都是一個普通的函數,普通函數沒有自動傳值的效果
案例如下:
class Foo: def f1(self): print(self) @classmethod def f2(cls): print(cls) @staticmethod def f3(a, b): print(‘f3‘, a * b)
import settings class Mysql: def __init__(self,ip,port): self.ip = ip self.port = port self.id = self.create_id() def tell_info(self): print(‘ip:%s port:%s id:%s‘%(self.ip,self.port,self.id)) @classmethod小案例def from_conf(cls): return cls(settings.IP,settings.PORT) @staticmethod def create_id(): import uuid return uuid.uuid4() obj1 = Mysql.from_conf() obj2 = Mysql(‘10.1.183.16‘,8080) obj1.tell_info() obj2.tell_info()
二.isinstance與issubclass
isinstance(obj,cls)檢查obj是否是類cls的對象
class Foo: pass obj = Foo() # 類型判斷 print(isinstance(obj,Foo))
issubclass(sub,super)檢查sub類是否是super類的子類
class Foo: pass class Bar(Foo): pass obj = Foo() # 判斷是否子類 print(issubclass(Foo,Bar))
三.反射
python面向對象中的反射:通過字符串的形式操作對象相關的屬性,python中的一切事物都是對象,用字符串取代點(.)對屬性的操作
hasattr(o,name)判斷某一個屬性是是否存在
setattr(obj,name,value)給對象一個屬性,屬性名給name,值為value
getattr(o,name,default)獲得對象name屬性的值,不聲明default時不存在該屬性會報錯
delattr(o,name)刪除對象的name屬性
class Person: def __init__(self,name,age): self.name = name self.age = age def run(self): print(‘%s run‘%self.name) obj = Person(‘Yven‘,18) delattr() print(hasattr(obj,‘name‘))#‘name‘ in obj.__dict__ print(getattr(obj,‘name‘,None))#obj.__dict__[‘name‘] setattr(obj,‘sex‘,‘male‘)#obj.__dict__[‘sex‘] = ‘male‘ print(obj.sex) delattr(obj,‘sex‘) print(obj.__dict__) setattr(obj,‘address‘,‘shanghaipudong‘) print(obj.address) print(hasattr(obj,‘address‘)) delattr(obj,‘address‘) print(hasattr(obj,‘address‘))
Python面向對象(三)