面向对象02-追加
3.内置类属性
class Student:
"""人类"""
num = 61
def __init__(self, name='张三', age=18, gender='男'):
self.name = name
self.age = age
self.gender = gender
def eat(self, food="面条"):
print(f"{self.name}在吃{food}")
@classmethod
def action(cls):
print(f"人类目前的数量是{cls.num}")
@staticmethod
def destroy():
print("人类破坏环境")
# 1.类.__doc__ - 获取类的说明文档
print(Student.__doc__) # 人类
# 2.类.__module__ - 获取指定类所在的模块
print(Student.__module__) # __main__
# 3.对象.__class__ - 获取指定对象对应的类型, 和type(对象)
p1 = Student()
print(p1.__class__) # <class '__main__.Student'>
print(type(p1)) # <class '__main__.Student'>
print('abc'.__class__) # <class 'str'>
# 4.类.__name__ - 获取类名(以字符串形式)
print('abc'.__class__.__name__) # str
datas = ['abc', -0.41, '你好', 34, 90, 12.7]
for data in datas:
with open(f'{data.__class__.__name__}.txt', 'a+', encoding='utf-8') as f:
f.write(str(data)+'\n')
# 5.
# 类.__dict__ - 将类装换成字典, key是字段名, 值是字段对应的值
# 对象.__dict__ - 将对象转换成字典, 对象属性名作为key, 属性值作为value
print(Student.__dict__)
print(p1.__dict__)
# 6.
# 类.__base__ - 获取指定类的父类
# 类.__bases__ - 获取指定类所有的父类
# object是python中所有类的基类
print(Student.__base__) # <class 'object'>
print(Student.__bases__) # (<class 'object'>,)
4.getter和setter
1) getter:
什么时候用:在获取对象属性前, 如果要别的什么事情, 就可以给这个属性添加getter
怎么用:
第一步:在需要添加getter的属性的属性名前加_
第二步: 在装饰器@property后面定义一个函数,函数名就是属性名去掉_,函数没有参数,需要一个返回值,
返回值就是获取这个属性值真正得到的结果
第三步: 通过对象获取属性的时候, 属性不需要带_
2) setter - 添加setter之前必须先添加getter
a.什么时候用: 如果要在某个对象属性赋值之前做别的什么事情, 就给这个属性添加setter
b.怎么用:
第一步: 在需要添加setter的属性名前加_
第二步: 在装饰器@getter名.setter后面定义一个函数;
函数名就是属性名去掉_
函数有一个参数(这个参数指向的时候赋值的时候赋的值), 没有返回值
第三步: 通过对象给属性赋值的时候,属性不需要带_
5.私有化
访问权限
公开的: 公开的属性和方法在类的内部、外部都可以用, 并且可以被继承
保护的: 保护的属性和方法在类的内部可以使用,外部不可以用, 但可以被继承
私有的: 私有的属性和方法在类的内部可以用, 外部不能用,不能被继承
python中的属性和方法只有一种访问权限: 公开的, 所谓的私有化是假的,只是一种声明
私有化的方法:在属性名和方法名前加__(注意: 只能是两个__开头,不能再用__结尾)
class Person:
num = 100
__info = '动物'
print(Person.num)
# print(Person.__info) # type object 'Person' has no attribute '__info'
6.运算符重载
1. 运算符
python在使用运算符的时候本质是在调用运算符对应的方法
每个运算符对应的方法的方法名是固定的, 不同类型的数据在参与相同的运算的时候是调用不同类中对应的方法
某个类型的数据是否支持某种运算,就看这个数据对应的类型中有没有实现这个运算符对应的方法
练习:
class Person:
def __init__(self, name='小明', age=18, gender='男'):
self.name = name
self.age = age
self.gender = gender
def __repr__(self):
return f'<{str(self.__dict__)[1:-1]}>'
def __lt__(self, other):
if self.age <= other.age:
return self.age, other.age
# 练习:将ps中的元素按照年龄的大小从小到大排序
p1 = Person()
p2 = Person('小花', 28, '女')
p3 = Person('张三', 20, '男')
p4 = Person('老王', 25, '男')
ps = [p1, p2, p3, p4]
print(ps)
# 方法一: 添加魔法方法
print(sorted(ps))
# 方法二: 使用内置sort方法
ps.sort(key=lambda item: item.age)
print(ps)