慢就是快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)
相关推荐
小小龙学IT21 小时前
Python Polars 高性能数据处理引擎深度解析
开发语言·python·rust·1024程序员节
csdn_aspnet21 小时前
JavaScript 未排序数组中第 k 个最小/最大元素 (预期线性时间)
python
quantdash_cc21 小时前
如何利用标的信息为研究股票池补充名称和交易所信息?
开发语言·python·pandas·量化交易·1024程序员节·股票数据·quantdash
数字化转型分享点滴21 小时前
机加工企业上大数据分析系统有哪些容易踩的坑?
python·1024程序员节
B2_Proxy1 天前
Scrapy 代理 IP 调度进阶:基于 Redis 与中间件的高可用架构实战
python·scrapy·1024程序员节
在世修行1 天前
智学文枢:AI 客户端封装
python·http·ai·1024程序员节·pyside
CRMEB系统商城1 天前
家电零售的供应商协同与物流提效
java·开发语言·人工智能·小程序·1024程序员节
王大师王文峰1 天前
Java+AI 面试题(二):业务场景设计 10 例【客服机器人、合同审查、Text2SQL、告警降噪、成本优化】场景题答法与追问链路
java·开发语言·人工智能
言乐61 天前
Python实现三轴联动根据数据自动打磨镜片模型
开发语言·python
万化冥合1 天前
如何批量把 PPT 转成视频?
python·1024程序员节