python基础(二)python的实例属性、类属性、访问控制

class Stu_score(object):
    """score of students"""
    name = None # 类属性
    score = None
    university = "MIT"
    address = "U.S.A"
    def __init__(self, name, score):
        self.name = name  # 实例属性,创建实例属性方式1.
        self.__score = score
    
    def get_score(self):
        return self.__score
    
    def set_score(self, score):
        if score >=0 and score <=100:
            self.__score = score
        else:
            raise Exception("Score is invalid! Check please!")
        
zhangsan = Stu_score("zhangsan", 98)
zhangsan.name  # 'zhangsan',先搜索实例属性,后搜索类属性。因为实例属性优先级高于类属性,故而会覆盖类属性从而不是None
zhangsan.university # MIT,先搜索实例属性发现没有,再搜索类属性故而为"MIT"
zhangsan.__score # 'Stu_score' object has no attribute '__score',这个私有实例属性已经被python换成了其他名字,故提示没有这个属性
zhangsan._Stu_score__score # 98,实例的私有属性__score被python解释器换成了_Stu_score__score
zhangsan.__score = 89 # 通过实例在外界为zhangsan这个实例绑定一个新的属性__score,这个属性仅属于zhangsan。创建实例属性方式2.
del zhangsan.__score # 删除通过外界方式创建的实例属性

关于访问控制
python它本身是不会限制用户的访问的,但是在某些时候我们应当遵循访问的控制
1.以双划线开始的变量,比如上面的__score属性,这种属性叫私有属性,无法直接访问,因为python利用改名的方式来限制直接对私有变量的访问,故而造成无法直接访问私有变量的情况。但又不是不可以访问,只要我们知道了它改成啥了,比如:
zhangsan._Stu_score__score。只是强烈不建议这么做,这是一种约定,“请不要随意访问”
2.以双划线开始和结尾的变量,以单下划线开始的变量,它们是程序员认为的非公开变量,尽管可以直接访问,但希望你把它视为私有变量,不要随意访问。

Q:那python就不能对访问加以控制吗?
A:在对类属性的控制中,仅仅可以做的就是设置私有变量,至少可以在表面上保证无法直接访问,python本身是不提供限制访问的,需要的是策略控制或者遵守规范。
Q:那我要获取私有变量怎么办?我想重置成绩怎么办?
A:像上面那样定义一个get_score、set_score的方法,尽管这相比于用实例直接调属性麻烦很多,但用函数的好处是:它是单向传递的比如获取分数它就只能获取分数,不能反向重置分数;重置分数,它就只能重置分数,无法知道它以前的值而且相比于用zhangsan._Stu_score__score=89来重置实例属性,它还可以提供值检测等额外的需求。如果你非要像访问属性那样来实现访问,可以将方法用@property进行装饰就可以实现了。@property内置装饰器使用示例:

class Stu_score(object):
    """score of students"""
    name = None # 类属性
    score = None
    university = "MIT"
    address = "U.S.A"
    def __init__(self, name, score):
        self.name = name  # 实例属性,创建实例属性方式1.
        self.__score = score
    
    # def get_score(self):
    #     return self.__score
    @property
    def score(self):
    	return self.__score
zhangsan = Stu_score("zhangsan", 98)
print(zhangsan.score) # 98。当加了@property装饰器score方法就可以用访问属性的方法访问方法,但它本质上还是个方法不可以进行赋值操作。它仅仅是允许了不用括号也能访问方法函数。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值