Python 类 面向对象

本文详细介绍了Python中如何通过私有变量和@property装饰器实现类的访问限制和属性封装,确保代码的健壮性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Python 类

  1. 访问限制
  • 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,就变成了一个私有变量(private),只有内部可以访问,外部不能访问。这样就确保了外部代码不能随意修改对象内部的状态,这样通过访问限制的保护,代码更加健壮。

    class Student(object):
        def __init__(self, name, score):
            self.__name = name
            self.__score = score
    
  • 但是如果外部代码要获取name和score怎么办?可以给Student类增加get_name和get_score这样的方法:

    class Student(object):
        def get_name(self):
            return self.__name
        def get_score(self):
            return self.__score
    
  • 如果又要允许外部代码修改score怎么办?可以再给Student类增加set_score方法:

    class Student(object):
        def set_score(self, score):
            self.__score = score
    
  1. 继承的好处
  • 继承可以把父类的所有功能都直接拿过来,这样就不必重零做起,子类只需要新增自己特有的方法,也可以把父类不适合的方法覆盖重写。
  1. slots
  • 如果我们想要限制实例的属性怎么办?比如,只允许对Student实例添加name和age属性。为了达到限制的目的,Python允许在定义class的时候,定义一个特殊的__slots__变量,来限制该class实例能添加的属性:

    class Student(object):
        __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
    
  1. 使用@property
  • 为了限制score的范围,可以通过一个set_score()方法来设置成绩,再通过一个get_score()来获取成绩,这样,在set_score()方法里,就可以检查参数:

    class Student(object):
        def get_score(self):
             return self._score
        def set_score(self, value):
            if not isinstance(value, int):
                raise ValueError('score must be an integer!')
            if value < 0 or value > 100:
                raise ValueError('score must between 0 ~ 100!') # 执行了raise语句,raise后面的语句将不能执行
            self._score = value
    
  • 但是,上面的调用方法又略显复杂,没有直接用属性这么直接简单。Python内置的@property装饰器就是负责把一个方法变成属性调用的。

    • 把一个getter方法变成属性,只需要加上@property就可以了。
    • 被 @属性名.setter 装饰的方法是设置属性值的方法。
    • 被 @属性名.deleter 装饰的方法是删除属性值的方法。
    class Student(object):
        @property # property将 score() 方法转化成同名只读属性的 getter 方法。
        def score(self):
            return self._score
        @score.setter
        def score(self, value):
            if not isinstance(value, int):
                raise ValueError('score must be an integer!')
            if value < 0 or value > 100:
                raise ValueError('score must between 0 ~ 100!')
            self._score = value
    
  1. getitem
  • 获取某个元素
  1. getattr
  • 正常情况下,当我们调用类的方法或属性时
  1. call
  • 一个对象实例可以有自己的属性和方法.
  1. super
  • super() 函数是用于调用父类(超类)的一个方法。super 是用来解决多重继承的顺序问题的。
  • Python3.x 和 Python2.x 的一个区别是: Python 3 可以使用直接使用 super().xxx 代替 super(Class, self).xxx :
    class A:
         def run(self):
             print('run')
    # python 2.x
    class B(A):
        def run(self):
            super(B,self).run()
    # python 3.x
    class B(A):
        def run(self):
            super().run()
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值