慢就是快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)
相关推荐
aifannihao2 小时前
Rust 1.100 的 DropGuard:用 Python 实测失败回滚与吞异常
python·rust·异常处理·标准库·contextlib
码农小河663 小时前
基于PHP的电商后台蜜罐系统
开发语言·php
starzy19903 小时前
深入理解Scala柯里化函数:函数链式变换
开发语言·scala
ShineWinsu3 小时前
对于Qt:QTreeWidget常见属性以及QTreeWidgetItem类的解析
开发语言·c++·qt·gui·客户端·多叉树·qtreewidget
落羽的落羽3 小时前
【C++】C++17的主要特性
linux·服务器·开发语言·c++·算法·机器学习
用户019027581614 小时前
天勤 tqsdk 能做 A 股行情吗?期货强项与股票数据选型
python
总要学点什么4 小时前
第108篇:三维特效-图片轨迹线效果——把贴图滚成一串箭头,想用它的本色反而整条消失
开发语言·javascript·ecmascript·gis·webgl·材质·cesium
2601_967979125 小时前
pip在Python中的9个必须知道的用法
python·pip·版本控制·包管理工具·requirements.txt
曲径海盗5 小时前
【Python 学习第 58 天】列表方法
python·学习笔记·编程入门
DeepVisionary5 小时前
Runway开源机器人大模型Praxis-1,推演延迟压到62毫秒
python·自动化