1. 程式人生 > >Python面向對象(三)

Python面向對象(三)

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面向對象(三)