python属性访问的相关内容

#-*-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
我正在运动。。。
我正在运动。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值