慢就是快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)
相关推荐
無限進步D1 小时前
Java Web 前端 简介
java·开发语言·前端·css·html·css3·web
夜雪一千2 小时前
如何使用Python做舆情分析
人工智能·python·数据分析
qq_401700412 小时前
Qt QUrl 详解与代码示例
开发语言·数据库·qt
小灰灰搞电子2 小时前
Rust Attribute(属性标记)完整整理
开发语言·后端·rust
Ticnix2 小时前
MCP 工具拿不到 user_id?用 contextvars 做请求级用户隔离
python·agent·mcp
gb42152872 小时前
WPS 里的 Word快速合成照片
python
tedcloud1232 小时前
God‘s Eye View 怎么搭建?在云服务器上部署一个实时 3D 地球可视化平台
linux·服务器·开发语言·后端·rust
Tairitsu_H3 小时前
[C++] C++11 Lambda与包装器深度解析
开发语言·c++·c++11·lambda·包装器