三种访问权限
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)