python动态添加属性(对象属性,类属性)

转载自 https://blog.csdn.net/weixin_45222544/article/details/94433021

前言

1,python是动态类型语言:可以在运行中改变自身结构,动态添加/删除属性和方法,删除函数

2,也是强类型语言:变量的类型可以在运行之后,任意变量,不需要强制转换

动态添加实例属性类属性的演示如下:

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

p = Person("皮皮", 1)

# 动态添加属性

# 1,以下是添加实例属性的两种方式
p.address = "义乌"
setattr(p, "gender", "男")  # 为p对象添加了一个名为gender的属性存储的值为
print("名字是%s 年龄是%d 地址是%s 性别是%s" % (p.name, p.age, p.address, p.gender))
print("名字是%s 年龄是%d 地址是%s 性别是%s" % (p.name, p.age, p.address, getattr(p, "gender")))

# 2,添加对象属性 类名.属性名
Person.CLS_ID = 110
print(p.CLS_ID)
123456789101112131415161718

运行结果为:

名字是皮皮 年龄是1 地址是义乌 性别是男
名字是皮皮 年龄是1 地址是义乌 性别是男
110
123

添加对象方法的演示如下:

import types  # 注意必须要先导入types这个模块
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 动态添加方法

# 1,添加实例方法(也可称为成员方法)
def study(self):
    print("一天不写代码难受!!!")

p = Person("皮皮", 1)
p1 = Person("彬彬", 18)

p.study = types.MethodType(study, p)
p.study()
# p1.study() 会报错,因为这添加的是对象方法,只能对象p调用
123456789101112131415161718

运行结果为:

一天不写代码难受!!!
1

添加静态方法和类方法的演示如下:

import types                    # 注意必须要先导入types这个模块
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

# 动态添加方法

# 2,添加静态方法
@staticmethod
def test():
    print("我是静态方法")
# 给类添加静态方法
Person.method = test            # 注意:这里不能加括号

# 3,添加类方法
@classmethod
def testClsMethod(cls):
    print("我是类方法")
Person.method22 = testClsMethod  # 注意:这里不能加括号

p = Person("皮皮", 1)
p1 = Person("彬彬", 18)

# 调用静态方法
p.method()       # 对象访问
p1.method()
Person.method()  # 提倡用类名.的方式去访问静态方法

# 访问类方法
p.method22()
p1.method22()
Person.method22()
123456789101112131415161718192021222324252627282930313233

运行结果为:

我是静态方法
我是静态方法
我是静态方法
我是类方法
我是类方法
我是类方法
123456

2,__slots__对动态添加属性及方法的限制作用

1,__slots__在动态添加属性和方法中,只对类对象进行限制,不对类进行限制

2,__slots__对动态添加类对象的属性和方法进行限制

3,__slots__对子类没有任何限制作用

版权声明:除特别注明外,本站所有文章均为王晨曦个人站点原创

转载请注明:出处来自王晨曦个人站点 » python动态添加属性(对象属性,类属性)

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注