Python3中的MethodType方法详解

from types import MethodType


class Student(object):
    pass


def set_name(self, name):
    self.name = name


s1 = Student()
s2 = Student()
s3 = Student()
# 为实例单独添加方法,Student类没有set_name方法,若Student的其他实例未添set_name方法,则他实例无法调用set_name,
# 每次调用仅作用于实例自身的name属性
s1.set_name = MethodType(set_name, s1)
s2.set_name = MethodType(set_name, s2)
s1.set_name('tom')
s2.set_name('tony')
print(hasattr(Student, 'set_name'))
# False
print(hasattr(s3, 'set_name'))
# False
print(s1.name, s2.name)
# tom tony


# 为Student设置set_name方法,每个实例都可以调用set_name方法,
# 每次调用作用于Student类的name
Student.set_name = MethodType(set_name, Student)
s1 = Student()
s2 = Student()
s1.set_name('tom')
s2.set_name('tony')
# 由于实例没有name属性,因此会直接返回Student类的name属性
print(s1.name, s2.name)
# tony tony
# 如果为每个实例单独设置name属性,则会返回每个实例自己的name属性
s1.name = 'tom'
s2.name = 'tony'
print(s1.name, s2.name)
# tom tony
# 从上面的例子可以看出,在编写程序的时候,
# 千万不要对实例属性和类属性使用相同的名字,
# 因为相同名称的实例属性将屏蔽掉类属性,
# 但是当你删除实例属性后,再使用相同的名称,访问到的将是类属性。

# 为Student添加方法,每个实例都可以调用set_name方法,
# 每次调用仅作用于实例自身的name属性
Student.set_name = set_name
s1 = Student()
s2 = Student()
s1.set_name('tom')
s2.set_name('tony')
print(hasattr(Student, 'set_name'))
print(s1.name, s2.name)
# tom tony

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值