慢就是快12-2三种访问权限|getter与setter|魔法方法

三种访问权限

python 复制代码
class Person:
    def __init__(self, name, age, idcard):
        self.name = name #公有属性:当前类中、子类中、类外部,都可以访问
        self._age = age #受保护的属性:当前类中、子类中,都可以访问
        self.__idcard = idcard #私有属性:仅能在当前类中访问

    def speak(self):
        print(f'我叫{self.name},年龄是{self._age},身份证:{self.__idcard}')

class Student(Person):
    def hello(self):
        print(f'我是学生{self.name}-{self._age}')
        # idcard 是私有属性:仅能在当前类中访问
        # print(f'我是学生{self.name}-{self._age}-{self.__idcard}')

p1 = Person('哈哈', 18, '354648955462145889')
print(p1.__dict__) # python底层是通过重命名的方式,实现私有属性的
print(p1.name)
# 在类的外部,访问【受保护的属性】,能访问到,但不推荐
# print(p1._age)
# 在类的外部,访问【私有属性】,不能访问到,而且会报错
# print(p1.__idcard)
s1 = Student('梨花', 16, '2026001')
s1.hello()

getter与setter

python 复制代码
class Person:
    def __init__(self, name, age, idcard):
        self.name = name #公有属性:当前类中、子类中、类外部,都可以访问
        self._age = age #受保护的属性:当前类中、子类中,都可以访问
        self.__idcard = idcard #私有属性:仅能在当前类中访问
    # 注册age属性getter方法,当访问Person实例的age属性时,下面的age方法就会被自动调用
    @property
    def age(self):
        return self._age

    # 注册age属性setter方法,当修改Person实例的age属性时,下面的age方法就会被自动调用
    @age.setter
    def age(self,value):
        if value<=120:
            self._age=value
        else:
            print('年龄非法,修改失败')

    @property
    def idcard(self):
        return self.__idcard[:6]+'******'+self.__idcard[-4:]
    @idcard.setter
    def idcard(self,value):
        print('身份证号码不允许修改')


p1 = Person('哈哈', 18, '354648955462145889')
print(p1.name)
print(p1.age)
p1.age=99
print(p1.age)

魔法方法

python 复制代码
# 概念:以__xxx__命名的特殊方法(双下划线开头和结尾)
# 特点:不需要我们手动调,我们只要准备好这些方法,Python会在特定场景下,去自动调用。
class Person:
    def __init__(self, name, age, gender):
        self.name = name
        self.age = age
        self.gender = gender

    # 当执行print(Person的实例对象)或str(Person的实例对象)时调用
    def __str__(self):
        return f'{self.name}-{self.age}-{self.gender}'

    # 当执行len(Person的实例对象)时调用
    def __len__(self):
        return len(p1.__dict__)

    # 当执行 Person的实例对象1 < Person的实例对象2 时调用
    def __lt__(self, other):
        return self.age < other.age

    # 当执行 Person的实例对象1 == Person的实例对象2 时调用
    def __eq__(self, other):
        return self.__dict__ == other.__dict__

    # 当执行 Person的实例对象 不存在的属性 时调用
    def __getattr__(self, item):
        return f'{item}属性不存在'


p1 = Person('哈哈', 18, '男')
p2 = Person('打打', 18, '女')
print(p1)
print(p2)
# res1=str(p1)
# res2=str(p2)
# print(res1)
# print(res2)
print(len(p1))
print(p1 < p2)
print(p1 > p2)
print(p1 == p2)
相关推荐
一水鉴天1 小时前
映射、哈希表与哈斯图:计算机科学的三种基线 20261003(元宝)
开发语言·人工智能
Frank_refuel1 小时前
C++11之一场名为“搬家”的 C++ 之旅
开发语言·c++
海绵宝宝转agent2 小时前
learn-claude-code第1-5章开源学习笔记分享
人工智能·笔记·python·学习
小奇不哭2 小时前
ROS2 单节点,RGB-D 深度相机局部路径提取 + B 样条平滑路径 + YOLOv8 障碍物检测 + 深度测距,用于移动机器人视觉局部循迹。
python·yolov8·ros2·cv2·路径探索循迹
小小龙学IT2 小时前
Python scikit-learn 机器学习库深度解析
python·机器学习·scikit-learn
Wang's Blog2 小时前
Java 项目实战: 外卖平台优化-Nginx配置文件结构与块层级
java·开发语言·nginx
2601_962071573 小时前
类变量和全局变量的查找路径有什么区别?
开发语言·python
卷无止境4 小时前
独立开发者的"富矿地带":哪些垂直领域值得你押注一辈子?
后端·python
\光辉岁月/4 小时前
5.java-数组
java·开发语言
Java后端的Ai之路4 小时前
Python进阶探索29_eval内置函数
开发语言·python·探索·eval·内置函数