Discuss / Python / 分析及总结

分析及总结

Topic source

1、python支持动态给类和实例增加属性和方法; 2、python __slots__只能限制实例的属性及方法,对于类则没有影响,对于子类则更是没有限制。

class Student(object):
    __slots__ = ('name', 'age', 'set_age', 'score')
    pass

s = Student()

# 动态给实例增加属性
s.name = 'Michael'
print(s.name)

# 动态给实例增加方法和属性
def set_age(self, age):
    self.age = age

from types import MethodType
s.set_age = MethodType(set_age, s)
s.set_age(25)
print(s.age)

# 动态给类增加属性
Student.gender = 'male'
print(Student.gender)
print(s.gender)

# 动态给类增加方法和属性
def set_score(self, score):
    self.score = score

Student.set_score = set_score
s.set_score(66)
print(s.score)

小梦哒勒

#2 Created at ... [Delete] [Delete and Lock User]

#3.将方法绑定给类后,类和实例都可以调用和访问属性与方法,这不受slots范围限制

#方法没有绑定给类而直接绑定给实例时,需要在slots规定范围中加入该方法和方法中的属性

小梦哒勒

#3 Created at ... [Delete] [Delete and Lock User]

#import -- coding:utf-8 --

#1、python支持动态给类和实例增加属性和方法;

#2、python slots只能限制实例的属性及方法,对于类则没有影响,对于子类则更是没有限制。

#3.将方法绑定给类后,类调用方法后,类和实例都可以访问类中的属性与方法,这不受slots范围限制

#方法没有绑定给类而直接绑定给实例时,需要在slots规定范围中加入该方法和方法中的属性 class Student(object): slots = ('name','age','set_age')#用slots限制类的实例的属性 pass s = Student()

动态给实例增加属性

s.name = 'Michael' print(s.name)

动态给类增加属性不受限制

Student.gender = 'male' print(Student.gender) print(s.gender)

动态给类增加方法和属性

def set_score(self, score):#如果在slots中没有属性score将报lotsAttributeError: 'Student' object has no attribute 'score' self.score = score Student.set_score = set_score#给类绑定方法和属性不受限制,可以不在slots中加set_score和score Student.set_score(Student,66)#类调用set_acore方法给自己绑定属性score为66 print(Student.score) print(s.score)#实例可以调用类属性scored但是不能用s.set_score(89)来中心赋值

动态给实例增加方法和属性

def set_age(self, age): self.age = age

from types import MethodType s.set_age = MethodType(set_age, s)#直接给实例绑定方法由于类中没有该方法,必须在slots中添加set_age, age才可以 s.set_age(25) print(s.age)

动态给类增加方法和属性

Student.set_age=set_age#给类绑定方法和属性不受限制,可以不在slots中加set_score和score s.set_age(26)#但是由于Student类没有调用set__age方法,所以类中没有age的值。实例调用该方法赋值就必须在slots中加上age属性了 print(s.age)

齐商0208

#4 Created at ... [Delete] [Delete and Lock User]

感谢两位大神,学习了。

扑街恒

#5 Created at ... [Delete] [Delete and Lock User]

def set_score(self, score):#如果在slots中没有属性score将报lotsAttributeError: 'Student' object has no attribute 'score'

我看上面的slots是没有属性 score 的 这个注释应该是错的吧

扑街恒

#6 Created at ... [Delete] [Delete and Lock User]

求教这里,为什么不能用s.set_score(89)? print(s.score)#实例可以调用类属性scored但是不能用s.set_score(89)来中心赋值

落汐21

#7 Created at ... [Delete] [Delete and Lock User]

我觉得可以直接s.score=89,或者s.set_score(s,89)

晓枫Nam

#8 Created at ... [Delete] [Delete and Lock User]

不能用s.set_score(89)是因为实例里面没有定义score,但可以动态加入类Student的属性score,虽然实例没有score属性,但Student有就可以直接拿来,所以print(s.score)不会报错

类已经添加了score属性,实例可以用s.set_score(89)来中心赋值了吧

def set_score(self, score):#如果在slots中没有属性score将报lotsAttributeError: 'Student' object has no attribute 'score 这句话是不是意思是如果类仅仅添加了这个方法,没有调用这个方法的话score这个属性就没有添加,所以会报错


  • 1

Reply