python動態創建屬性方法 tcy

1.1.動態添加屬性方法:

    方法1:用對象名.屬性名添加:p.age = 18
    方法2:用setattr添加:if not hasattr(p,'age'):setattr(p,'age',18)

1.2.動態刪除屬性和方法:
    方法1:del 對象.屬性名
    方法2:delattr(對象,"屬性名")

1.3.__slots__限制實例屬性方法:
    用途:
        限制類實例動態添加屬性;使依賴__dict__無效;提高代碼運行速度
        
    注意:
        __slots__限制只對類實例起作用,對繼承子類不起作用
2.實例:

實例1:#動態添加屬性,方法

# 類定義
class Student():
    def __init__(self, name='Tom'):
        self.name = name

# 調用  
s,s1 = Student(),Student()
# 1.1.動態添加屬性:
# 方法1:動態添加實例屬性:sex
s.sex='man'

# 方法2:通過動態添加實例方法間接綁定屬性:age
def setAge(self, age):  
    self.age = age
    
from types import MethodType
s.setAge = MethodType(setAge, s)     # 動態實例綁定方法

 

#方法3:動態添加類屬性
Student.score=99

 

# 1.2.動態屬性測試:
s.setAge(22)
s.name,s.sex,s.age,s.score,Student.score# ('Tom', 'man', 22, 99, 99)
s.score=80
s.name,s.sex,s.age,s.score,Student.score#('Tom', 'man', 22, 80, 99)
Student.score=98
s.name,s.sex,s.age,s.score,Student.score# ('Tom', 'man', 22, 80, 98)
 
s1.score# 98
# s1.age   # AttributeError  
# 2.1.1.動態添加實例方法:
def add(self,x,y):
    return x+y
    
def sub(self,x,y):
    return x-y
    
mul=lambda self,x,y:x*y
    
s.add = MethodType(add, s)  #參數1爲函數,參數2爲實例對象
s.sub=sub  # Python不會自動將調用者綁定到參數1(self)需手動將調用者綁定爲參數1(實例對象) 
s.mul=mul  # 能自動綁定參數1

# 測試:
s.add(2,3),s.sub(s,2,3),s.mul(s,2,3)            #(5, -1, 6)
# s1.add(2,3),s1.sub(s1,2,3),s1.mul(s1,2,3)#都錯誤
# s.sub(2,3),s.mul(2,3)                              #都錯誤
# 2.1.2.動態添加all實例方法:
def add1(self,x,y):
    return x+y
    
def sub1(self,x,y):
    return x-y
    
mul1=lambda self,x,y:x*y
    
Student.add1 = MethodType(add1, s)  
Student.sub1=sub1  
Student.mul1=mul1

# 測試:
s.add1(2,3),s.sub1(2,3),s.mul1(2,3)                                     #(5, -1, 6)
Student.add1(2,3),Student.sub1(s,2,3),Student.mul1(s,2,3)   #(5, -1, 6)
Student.add1(2,3),Student.sub1(s1,2,3),Student.mul1(s1,2,3)#(5, -1, 6)
# Student.sub1(2,3),Student.mul1(2,3)                                 #都錯誤

 

# 2.2.動態添加類方法: 

@classmethod
def sport(cls,speed):
    cls.score=80
    return cls.score+speed
 
Student.sport = sport
Student.sport(100)#180
Student.score       # 80
# 2.3.動態添加靜態方法:  
@staticmethod
def draw(hourse):
    return hourse
 
Student.draw = draw
Student.draw('draw hourse')#'draw hourse' 

 

# 3.動態刪除屬性和方法:
print(hasattr(s,'score'),hasattr(s,'setAge'))          # True True 查看屬性方法
del s.score;del Student.score;delattr(s,'setAge')# 刪除屬性方法
print(hasattr(s,'score'),hasattr(s,'setAge'))          # False False

setattr(s,'score',80);setattr(Student,'score',88)     # 動態創建屬性
s.setAge = MethodType(setAge, s)                     # 動態創建方法
print(hasattr(s,'score'),hasattr(s,'setAge'))          # True True
實例2:#__slots__限制實例屬性方法
# 類定義
class Boy(object):
    __slots__ = ('name', 'age','foo')            # 限制實例屬性方法僅能爲name,age,foo
    def __init__(self):
        pass
 
# 調用 
s = Boy()                    
s.name = 'Tom'              # 綁定屬性'name'
s.age = 25                     # 綁定屬性'age'
#s.score = 99                # 綁定屬性'score' 引發AttributeError

fx=lambda self,x,y:x+y
s.foo = lambda self,x,y: print(self.name,x,y) #實例方法slots中一定要有該名稱
bar= lambda self,x,y: print(self.name,x,y)    #類方法,slots不必有
Boy.bar =bar

s.bar(2,3),bar(s,2,3)                  # Tom 2 3  Tom 2 3
s.foo(s,2,3)                              #Tom 2 3 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章