Python 动态绑定

现在先创建一个类,设置一些基本属性…

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是共通的…(懂我意思吧)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值