[Python] 类的访问限制

4.1 访问限制

在之前的专栏:Python基础中,笔者在面向对象编程中介绍了类、对象的属性,按照属性的访问程度可以分为一般属性和私有属性。
通常,在类、对象中,如果一个属性名以__开头,则代表这个属性是私有属性,正常情况下是不可以在外部直接调用或修改该属性的。通过将属性设置成私有属性就是访问限制
访问限制是为了程序的健壮性,使得无法直接在外部修改某些特定的属性,保证了程序的正常运行。
举个例子,如果某个类中有个属性是用来存放年龄的,而有个方法需要用到这个年龄属性,并且是将这个年龄作为了除数,如果不小心设置或者输入年龄为0,那么就会导致程序出错。
对于某些比较重要的属性,我们如果想要用户能够获取到或者修改,则可以通过自定义方法实现,比如:getage、setage。通过方法设置属性可以进行参数检查,避免传入错误或无效的参数。
定义私有变量

class Person:
    def __init__(self):
        self.name = 'lucy'
        self.__age = 10


p = Person()
ic(p.name)
ic(p.__age)

17:09:42|> p.name: ‘lucy’
Traceback (most recent call last):
File “E:\t1.py”, line 12, in
ic(p.__age)
AttributeError: ‘Person’ object has no attribute ‘__age’

我们可以看到,可以在外部直接获取到属性name,但是无法获取到属性__age
通过方法获取属性

from icecream import ic


class Person:
    def __init__(self):
        self.name = 'lucy'
        self.__age = 10

    def getage(self):
        return self.__age


p = Person()
ic(p.getage())

17:28:25|> p.getage(): 10

通过方法修改属性

from icecream import ic


class Person:
    def __init__(self):
        self.name = 'lucy'
        self.__age = 10

    def getage(self):
        return self.__age

    def setage(self, age):
        if isinstance(age, int) and 0 < age < 150:
            self.__age = age
        else:
            ic('输出的年龄有误,请核对!')


p = Person()
p.setage(20)
ic(p.getage())
p.setage(200)
ic(p.getage())

18:03:42|> p.getage(): 20
18:03:42|> ‘输出的年龄有误,请核对!’
18:03:42|> p.getage(): 20

4.1.2 封装

在python中,封装是一种代码组织技术,可用于将数据和关联的方法(函数)作为一个单元进行管理。可以通过在类中定义公共方法来控制对类成员变量的访问,并保护它们免受不必要的修改。
封装有以下作用:

  • 将数据与相关行为捆绑在一起,以方便管理和维护代码。
  • 隐藏具体实现细节,使得代码更加安全和抽象化。
  • 通过只暴露有限的接口来减少代码的复杂度,提高代码的可读性和可维护性。
  • 改进了软件模块之间的互操作性和协作能力,使得软件更加可扩展和灵活。
    在python中,可以使用特殊的命名约定来模拟私有成员。我们可以在名称前加上双下划线"__",这样就可以防止其他人意外地访问到该成员,并且只能通过类中定义的公共方法来访问。
class Car:
    # 定义类私有变量
    __max_speed = 0
    __mileage = 0
 
    def __init__(self):
        # 初始化变量
        self.__max_speed = 200
        self.__mileage = 10
 
    # 定义公共方法
    def drive(self):
        print('Driving. Max speed:', self.__max_speed)
 
    # 定义getter和setter方法
    def get_max_speed(self):
        return self.__max_speed
 
    def set_max_speed(self, speed):
        self.__max_speed = speed
 
car = Car()
print(car.get_max_speed()) # 输出200
car.set_max_speed(250)
car.drive() # Driving. Max speed: 250

在上面的代码中,Car 类定义了两个私有变量 __max_speed 和 __mileage,这些变量只能在类的内部使用。然后,我们定义了一个公共方法 drive(),它可以在类的外部访问,并且使用getter和setter方法来管理变量 __max_speed 的值。这样,我们就可以通过类的公共接口访问其数据和方法,而不需要直接访问其私有变量。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中,访问权限是通过属性和方法的命名约定来实现的,而不是通过关键字或修饰符来定义。Python中没有像其他编程语言(如Java或C++)中的public、private、protected等关键字来明确指定访问权限。 在Python中,有以下几种常用的属性和方法的命名约定来表示访问权限: 1. 公有属性和方法:以单下划线开头(例如:_name),表示该属性或方法是公有的,可以在的内部和外部访问。 2. 私有属性和方法:以双下划线开头(例如:__name),表示该属性或方法是私有的,只能在的内部访问。私有属性和方法在的外部是无法直接访问的,但可以通过特殊的方式进行访问(后面会介绍)。 3. 受保护属性和方法:以单下划线开头(例如:_name),表示该属性或方法是受保护的,只能在的内部和子访问。 需要注意的是,这些命名约定并不能真正限制对属性和方法的访问,它们只是一种约定,用于告诉其他开发者应该如何使用这些属性和方法。Python的设计理念是“我们都是成年人”,即相信开发者会遵守这些约定,但并不强制执行。 如果你想在的外部访问私有属性和方法,可以通过以下方式: 1. 使用单下划线+名+属性名(例如:_ClassName__name)来访问私有属性。 2. 使用单下划线+名+方法名(例如:_ClassName__method())来调用私有方法。 这种方式虽然可以访问私有属性和方法,但并不推荐在实际开发中使用,因为它破坏了封装性和安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

0思必得0

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值