Python动态添加属性和方法

本文详细介绍了在Python中如何动态地为对象添加属性和方法,包括使用对象.属性名、setattr函数添加属性,以及利用types.MethodType添加实例方法,直接赋值给类添加类方法和静态方法,并展示了如何动态删除属性和方法。

动态添加属性,就是这个属性不是在类定义的时候添加的,而是在程序运行过程中添加的,动态添加属性有两种方法,第一个是直接通过对象名.属性名,第二个是通过setattr添加:
1、第一种:使用对象.属性名添加:

p.ageb= 18

2、第二种,使用setattr函数添加:

class Person:
    def __init__(self, name):
        self.name = name

p = Person('lyc')
p.age = 18
if not hasattr(p, ’sex’):
    setattr(p, 'sex', 'male')
print(p.sex)

· 动态添加方法
动态添加实例方法:
动态添加方法,意思是方法不是在类定义的时候添加的。而是创建完这个对象后,在运行的时候添加的。如果想要在运行的时候添加方法,这时候就应该使用到types.MethodType这个方法了,示例:

import types
class Person:
    def __init__(self, name):
        self.name = name

def run(self):
    print('%s run func' % self.name)

p1 = Person('lyc')
p1.run = types.MethodType(run, p1) #这里p1为run方法的参数, 即self
p1.run()

动态添加类方法:
添加类方法,是把这个方法添加给类。因此添加类方法的时候不是给对象添加,而是给类添加。并且添加类方法的时候不需要使用types.MethodType,直接将这个函数赋值给类就可以了,但是需要使用classmethod装饰器将这个方法设置为一个类方法。

@classmethod
def show(cls):
    print('这是类方法')

Person.show = show
Person.show()

动态添加静态方法:

@classmethod
def show(cls):
    print('这是类方法')

Person.show = show
Person.show()
·  动态删除属性和方法
1、del 对象.属性名
print(p1.name)
del p1.name
print(p1.name)
2、delattr(对象,“属性名”)
print(p1.name)
del p1.name
print(p1.name)

魔术方法__slots__:
使用__slots__来指定类中允许添加的属性,如下只能添加 name,和age这两个属性

class Person:
    __slots__ = ('name', 'age')
    def __init__(self, name):
        self.name = name

p2 = Person('lyc')
p2.age = 18
print(p2.age)
#下边代码会报错
p2.country = 'zh'
Python中,类动态绑定属性方法允许在对象创建后为其添加属性方法,这体现了Python动态特性。 ### 动态绑定属性 若只想给一个实例对象添加属性,那么就可以使用动态绑定属性方法。为实例对象添加属性,只适用于该对象使用。示例如下: ```python class Student: def __init__(self, name, age): self.name = name self.age = age stu1 = Student('张三', 20) stu2 = Student('李四', 21) # 为stu1动态添加属性 stu1.gender = "男" print(stu1.name, stu1.age, stu1.gender) # 输出: 张三 20 男 # print(stu2.name, stu2.age, stu2.gender) # 报错,对象里没有该属性 ``` 上述代码中,`gender`属性只绑定到了`stu1`实例对象上,`stu2`实例对象没有该属性,若尝试访问会引发`AttributeError`错误[^2]。 ### 动态绑定方法 同样,也可以在对象创建后为其动态绑定方法。示例如下: ```python class Student: def __init__(self, name, age): self.name = name self.age = age def study(self): print(f"{self.name}正在学习") stu1 = Student('张三', 20) # 动态绑定方法 from types import MethodType stu1.study = MethodType(study, stu1) stu1.study() # 输出: 张三正在学习 ``` 上述代码中,`study`方法动态绑定到了`stu1`实例对象上,之后就可以像调用普通实例方法一样调用它。 ### `__dict__`属性动态绑定 对于类来说,`__dict__`包含了类的静态函数、类函数、普通函数、全局变量以及一些内置的属性。而对于类的实例对象来说,`__dict__`则包含了与实例相关的属性及其值。动态绑定的属性方法也会反映在实例对象的`__dict__`属性中。示例如下: ```python class MyClass: class_var = 1 def __init__(self, instance_var): self.instance_var = instance_var obj = MyClass(10) print(MyClass.__dict__) # 类的__dict__属性 print(obj.__dict__) # 实例对象的__dict__属性 # 动态绑定属性 obj.new_attr = 20 print(obj.__dict__) # 包含了新绑定的属性 ``` 上述代码展示了类实例对象的`__dict__`属性,以及动态绑定属性后实例对象`__dict__`属性的变化[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值