day18-面向对象02-追加

面向对象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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值