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