**
1,python动态添加属性(对象属性,类属性)
**
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)
运行结果为:
名字是皮皮 年龄是1 地址是义乌 性别是男
名字是皮皮 年龄是1 地址是义乌 性别是男
110
添加对象方法的演示如下:
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调用
运行结果为:
一天不写代码难受!!!
添加静态方法和类方法的演示如下:
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()
运行结果为:
我是静态方法
我是静态方法
我是静态方法
我是类方法
我是类方法
我是类方法
**
2,__slots__对动态添加属性及方法的限制作用
**
1,__slots__在动态添加属性和方法中,只对类对象进行限制,不对类进行限制
2,__slots__对动态添加类对象的属性和方法进行限制
3,__slots__对子类没有任何限制作用