Python(动态添加属性和方法、_slots_属性)

动态语言:运行时可以改变其结构的语言,列如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化。如: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后,对父类也起作用。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值