#-*-coding:utf-8 -*-
'''
属性访问的相关内容
__slots__的用法
属性的动态绑定
'''
from types import MethodType
class Stduent():
classname='student' #类的属性
__slots__ = ('name', '__age','__score','study') # 用tuple定义允许绑定的属性名称,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的
def __init__(self,name='java',*args):
self.name=name #实例的属性
def setScore(self,value):
#设置分数,只能是在0-100的范围内
if type(value)==int:
if value>=0 and value<=100:
self.__score=value
else:
print('设置的分数有误!')
else:
print('分数只能是数字类型!')
def getScore(self):
return self.__score
def delScore(self):
del self.__score
s=property(getScore,setScore,delScore) # 这样就可以直接按.s直接访问s这个属性了
@property
def age(self):
return self.__age
@age.setter
def age(self,value):
if type(value)==int and value>=0:
self.__age=value
else:
print('设置的年龄有误!')
def __str__(self):
return 'This is Stduent class'
__repr__=__str__
print(Stduent.classname) #打印类的属性
a=Stduent()
print(a.name) #打印实例的属性
print(a) #打印__str__的内容
a #显示__repr__的内容 ,repr,representation代表的意思
#属性的访问除了用点来访问还可以用方法getattr来访问
print(getattr(a,'name','没有这个属性!'))
print(getattr(a,'age','没有这个属性!')) #第三个参数为没有找到属性的时候返回的内容
b=Stduent('php',25)
print(b.name)
del b.name #把对象的属性name删除掉,这时候如果要直接访问b.name就会出错,因为已经没有实例b已经没有name属性了
# b.score=99 不能直接设置score属性了,slots里面没有该属性,不能动态添加
# print(b.score)
# b.score=200
# b.score='88'
b.setScore(60) #这样就可以避免直接通过属性score修改值了
print(b.getScore())
b.s=99 #通过s属性也可以修改score的值
print(b.s)
b.age=20
print(b.age)
b.age=-10
#添加study一个方法
def study(self):
print('我正在学习python')
b.study=MethodType(study,b) #动态绑定到实例b上
b.study()
b2=Stduent()
# b2.study() 由于study方法只绑定到实例b上,所以b2上就没有这个方法
#如果要让所有实例都拥有这个方法可以将方法动态绑定到类上
def sport(self):
print('我正在运动。。。')
Stduent.sport=MethodType(sport,Stduent)
b2.sport()
b.sport() #所有实例都有sport这个方法了
输出结果:
student
java
This is Stduent class
java
没有这个属性!
php
60
99
20
设置的年龄有误!
我正在学习python
我正在运动。。。
我正在运动。。。