天天看點

day18-面向對象02-追加面向對象02-追加1. 運算符

面向對象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)