现在先创建一个类,设置一些基本属性…
class Person(object):
def __init__(self, name=None, age=None):
self.name = name
self.age = agg
运行中给实例对象绑定(添加)属性
class Person(object):
def __init__(self, name=None, age=None):
self.name = name
self.age = age
#实例化两个对象p,p1
p = Person("小明", "24")
p1 = Person("小红", "23")
'---------------这是上面的代码'
# 给p(小明)这个对象添加一个sex方法
p.sex = 'male'
print(p.sex)
这里我就完成了动态的给p添加了一个sex属性
(p2肯定没有sex这是python基础知识)
运行中给类绑定(添加)属性
class Person(object):
def __init__(self, name=None, age=None):
self.name = name
self.age = age
# 动态的添加类属性
Person.sex = 'male'
p = Person("小明", "24")
p1 = Person("小红", "23")
print(p.sex)
print(p1.sex)
这里我完成了动态的给类添加一个sex属性,之后创建出来的对象都可以调用这个类属性了.
(python基础里面讲过,实例修改类属性,并不是真正的修改,而是绑定了一个新的sex,类的sex被屏蔽掉了)
运行中给实例对象绑定(添加)方法
class Person(object):
def __init__(self, name=None, age=None):
self.name = name
self.age = age
# 在类外面有一个方法
def run(self, speed):
print("%s在移动, 速度是%dkm/h" % (self.name, speed))
# 创建对象
p1 = Person("xiaom", 24)
#动态添加方法
p1.run = run
#调用成功
p1.run(p1, 100)
把run这个函数的引用,传给p1.run这个属性(方法也叫属性),那p1调用run的时候,还要手动的传入p1这个对象
原理是 :让run方法里面的self.name变为p1.name.
我们还可以利用MethodType
import types
# methodtype绑定方法和对象,参1传入要绑定的方法,参2要绑定的对象
p1.run = types.MethodType(run, p1)
# 绑定后 self会自动传入,我们就可以直接调用了
p1.run(1000)
这也是给p1绑定的,别的对象用不了
动态的绑定类方法和静态方法
这就比较简单了,直接赋值就行了
# 定义一个类方法
@classmethod
def test_class(cls):
cls.age = 100
print("age=%d" % cls.age)
# 定义一个静态方法
@staticmethod
def test_static():
print("---static method----")
# 给Person类绑定类方法
Person.test_class = test_class
# 调用类方法
Person.test_class()
# 给Person类绑定静态方法
Person.test_static = test_static
# 调用静态方法
Person.test_static()
我门还是用上面那个类继续做, 在外面写的这种带装饰器的方法,不在类里面一点作用没有,只有让他和类帮定以后才有作用.
解除绑定(删除)
# del p1.run
# p1.run()
# 参1传入对象 参2传入要删除的方法名字 注意传字符串
delattr(p1, 'run')
# 同样也能解除类的绑定
delattr(Person, 'test_class')
Person.test_class() #没有了,会报错
第一种方法直接使用del删除,第二种是使用了delattr方法.
限制动态添加 _slots_
class Person:
__slots__ = ('name', 'age')
def __init__(self):
self.name = 'xioaming'
self.age = 12
#self.hobby = "篮球"
因为slots里面没有hobby,所以不能添加hobby
这种限制主要用于,防止别人随意动态添加实例属性(类属性不限制)
如果Person被继承了,那他的子类是不受限制的.值得一提的是:如果他的子类也添加了slots限制,那么他和父类的slots是共通的…(懂我意思吧)