动态语言:运行时可以改变其结构的语言,列如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。如:php,javaScript\python都是动态语言,C,c#,java是静态语言。
python动态添加属性
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
pass
def __str__(self):
return '{}今天{}岁了'.format(self.name, self.age)
pass
xw=Student('小红',12)
print(xw)
#这个就是动态的进行添加,只属于xw所拥有。
xw.color='红色'
print(xw.color)
print('---创建另外一个新的实例对象 张明')
zm=Student('张明', 23)
print(zm)
print('------给类对象添加属性-----')
#这个就是动态的添加类属性。
Student.school='北京大学'
#通过类可以访问类和实例属性。
zm.school
动态添加方法
import types #添加方法的库
#把这个方法动态的添加这个类里
def dymicmethod(self):
print('{}在{}那里上学'.format(self.name, Student.school))
pass
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
pass
def __str__(self):
return '{}今天{}岁了'.format(self.name, self.age)
pass
xw=Student('小红',12)
Student.school='北京大学'
#动态的绑定方法(绑定方法+对象)
xw.printInfo=types.MethodType(dymicmethod, xw)
print(xw)
#执行动态的添加调用
xw.printInfo()
#把这个方法动态的添加这个类里
def dymicmethod(self):
print('{}在{}那里上学'.format(self.name, Student.school))
pass
@classmethod
def classTest(cls):
print('这是一个类方法')
#绑定类方法
pass
@staticmethod
def staticTest():
print('这是一个静态方法')
#绑定静态方法
class Student:
def __init__(self,name,age):
self.name=name
self.age=age
pass
def __str__(self):
return '{}今天{}岁了'.format(self.name, self.age)
pass
print('绑定类方法')
Student.Testmethod=classTest
Student.Testmethod()
Student.Testmethod1=staticTest
Student.Testmethod1()
print('---绑定类方法执行结束')
xw=Student('小红',12)
#可以实例去访问类方法
xw.Testmethod()
__slots__属性
来限制改类实例能添加的属性,只有在slots变量中的属性才能被添加,没有在slots变量中的属性会添加失败。可防止其他在调用类的时候胡乱添加属性或方法。slots属性子类不会被继承,只有在当类中有效。
#作用
#限制要添加的实例属性
#节约内存空间。
class Student(object):
__slots__=('name')
pass
xw=Student()
xw.name='小王'
#print(xw.__dict__) #所有属性都存在这里,不是的地方就是占用的内存空间大
#可以看到在定义了slots变量之后,student类的实例已经不能随意创建不在——slot_定义的属性了,同时,我们可以实例中也不再有dict结构了。
#xw.age=12
#这里就不能条件age这个属性了。
#在继承当中的使用。
class subStudent(Student):
pass
xm=subStudent()
xm.age=12
print(xm.age)
#可以看到在这里是可以添加年龄这个属性的。
#它的性质是自身的类和父类。比如这里添加了slots后,对父类也起作用。