Day15—類和對象2

1 內置類屬性

  • 內置類屬性就是魔法屬性
    魔法屬性:屬性名的前面和后面都有兩個下劃線。
    魔法方法:方法的前后都有兩個下劃線琉闪。

聲明一個人的類:

class Person:
    """人類"""
    # 類的字段
    number = 61
    def __init__(self, name, age, height):
        # 對象的屬性
        self.name = name
        self.age = age
        self.height = height

    # 對象方法
    def run(self):
        print('%s在跑步' % self.name)

    # 類方法
    @classmethod
    def show_number(cls):
        print('人類的數(shù)量為%d億' % cls.number)

    # 靜態(tài)方法
    @staticmethod
    def destory():
        print("人類在破壞環(huán)境")

實例化一個對象:

p1 = Person('張三', 28, 170)
    # 1.__name__屬性  ---> 類的名字(是個字符串)
    # 類的屬性
    name = Person.__name__
    print(name, type(name), type(Person))

    # 2.__class__屬性 --->  獲取對象對應的類(是一個類)
    # 對象的屬性
    # my_class是一個類,之前類能做的事情他都能做
    my_class = p1.__class__
    p2 = my_class('小明', 20, 180)
    print(Person.__class__)
    print(p2.name, my_class.__name__)

    # 3.__dict__屬性  --->  將對象和類的屬性及其對應的值轉換成鍵值對存到一個字典中
    print(Person.__dict__)  # 字典形式獲取類中的所有內容
    print(p1.__dict__)

    # 4. __doc__屬性  --->  獲取類的說明文檔
    doc = Person.__doc__
    print(doc)

    # 5.__module__屬性  --->  獲取類所在的模塊對應的名字
    print(Person.__module__)
    print(datetime.datetime.__module__)

    # 6.__bass__屬性  --->  獲取當前類的父類
    # 類的屬性
    print(Person.__bases__)

2 slots魔法

通過slots中存的元組的屬性的值珠洗,來約束當前這個類的對象的屬性棒卷。對象的屬性只能比元組中的元素少,不能多咒锻!

class Person:
    """人類"""
    __slots__ = ('name', 'age', 'face')
    def __init__(self):
        self.name = '張三'
        self.age = 18
        self.face = 70
        # self.sex = 'boy'  # __slots__中并沒有sex

p1 = Person()
p1.sex = 'girl'
#print(p1.sex)  # AttributeError: 'Person' object has no attribute 'sex'

注意: 一旦在類中給—__slots__屬性賦了值,那么這個類的對象__dict__屬性就不能使用了

3 屬性的私有化

  • 首先注意:
    python中并沒有真正的私有化僻爽!
    python的類中默認的屬性和方法都是公開的虫碉。

  • 1.私有化
    a.類中的屬性和方法都可以通過在屬性名和方法名前加兩個下劃線,來讓屬性和方法變成私有的胸梆。
    b.私有的屬性和方法只能在當前的類中使用

  • 2.私有化原理
    在前面有兩個下劃線的屬性名和方法名前添加了'_類名'來阻止外部通過直接訪問屬性名來使用屬性敦捧。

例如,聲明一個狗類:

class Dog:
    """狗類"""
    # 字段
    number = 100
    __count = 200  # 這里的count就是私有化屬性

    def __init__(self):
        # 對象的屬性
        self.color = '黃色'
        self.age = 3
        self.name = '大黃'
        self.__sex = '公狗'  # 私有化sex屬性

    # 對象方法
    def eat(self):
        print('%s在吃狗糧~' % self.name)

    # 類方法
    @classmethod
    def shout(cls):
        print('count:', cls.__count, Dog.__count)  # 在class內部可以通過類名和cls調用
        print('汪汪汪~')

    # 靜態(tài)方法
    @staticmethod
    def function():
        print('看家E鼍怠兢卵!')

實例化一個狗對象:

d1 = Dog()
# 在類的外面不能直接使用私有的屬性
# print(Dog.__count)
# print(d1.__sex)
print(d1.__dict__)
print(d1._Dog__sex)

輸出結果為:

{'color': '黃色', 'age': 3, 'name': '大黃', '_Dog__sex': '公狗'}
公狗

4 屬性的getter和setter

  • 1.保護類型的屬性:
    a.就只在聲明對象屬性的時候,在屬性名前加一個下劃線绪颖,來代表這個屬性是受保護的屬性秽荤。
    那么以后訪問這個屬性的時候就不要直接訪問,要通過getter來獲取屬性的值和setter來給這個屬性賦值柠横。
    b.如果一個屬性已經(jīng)聲明成保護類型的屬性窃款,那么我們就需要給這個屬性添加getter。也可以添加setter

  • 2.添加getter
    添加getter其實就是聲明一個沒有參數(shù)牍氛,有一個返回值的函數(shù)晨继。作用是獲取屬性的值
    a.格式:
    @property
    def 去掉下劃線的屬性名(self):
      函數(shù)體
      返回值
      將屬性相關的值返回
    b.使用場景
    場景一:如果想要獲取對象的某個屬性的值前,想要干點別的事情搬俊,就可以給這個屬性添加getter
    場景二:想要拿到某個屬性被使用的時刻

  • 3.添加setter
    添加setter就是聲明一個有一個參數(shù)但是沒有返回值的函數(shù)紊扬。作用是給屬性賦值

具體使用方法如下代碼所示:

class Car:
    """車類"""
    def __init__(self):
        self.color = '黃色'
        self.type = '自行車'
        # _price屬性是保護類型
        self._price = 10000

    # 給_price屬性添加getter
    @property
    def price(self):
        print('在使用_price屬性')
        return self._price

    # 想要給一個屬性添加setter,必須先給這個屬性添加getter
    @price.setter
    def price(self, price1):
        if isinstance(price1, int) or isinstance(price1, float):
            self._price = str(price1) + 'K'
        else:
            self._price = 0

實例化一個類:

c1 = Car()
# print(c1.color, c1.type, c1._price)
#添加完getter后就通過getter去獲取屬性的值
# price就是屬性_price的getter
print(c1.price)
c1.price = 1000
print(c1.price)
c1.price = 'abc'
print(c1.price)

輸出結果為:

在使用_price屬性
10000
在使用_price屬性
1000K
在使用_price屬性
0

5 類的繼承

python中的類可以繼承唉擂,并且支持多繼承餐屎。
程序中的繼承:就是讓子類直接擁有父類的屬性和方法(繼承后父類中的內容不會因為被繼承而減少)

  • 1.繼承的語法
    class 子類(父類):
     類的內容
    注意:如果聲明類的時候沒有寫繼承,那么這么類會自動繼承python的基類玩祟,object腹缩。
    相當于:class 類名(object)
    python中的類都是直接或間接的繼承自object
  • 2.能繼承哪些東西
    a.所有的屬性和方法都能繼承
    b.__slots__的值不會繼承,但是會影響子類對象__dict__屬性。不能獲取到父類繼承下來的屬性

具體示例如下所示藏鹊,創(chuàng)建一個人的類作為父類:

class Person(object):
    """人類"""
    # 字段
    number = 16

    # __slots__ = ('name', 'age')
    # 對象屬性
    def __init__(self, name1='張三', age1=18):
        self.name = name1
        self.age = age1
        self.__heiget = 180

    # 對象方法
    def show_message(self):
        print('姓名:%s胜臊,年齡:%d' % (self.name, self.age))

    # 類方法
    @classmethod
    def show_number(cls):
        print('人類的數(shù)量:%d' % cls.number)

    # 靜態(tài)方法
    @staticmethod
    def complaint():
        print('人類毆打小動物!')

創(chuàng)建一個學生類伙判,繼承人類,并使用人類的屬性和方法:

class Student(Person):
    """學生類"""
    pass
# 創(chuàng)建Person類
p1 = Person()
# 創(chuàng)建學生類
stu1 = Student()
# 類的字段能繼承
print(Student.number)
# 對象的屬性能繼承
print(stu1.name)
stu1.name = '李四'  # 能修改
print(stu1.name)
# 對象的方法能繼承
stu1.show_message()
# 類的方法能繼承
stu1.show_number()
# 靜態(tài)方法能繼承
stu1.complaint()
stu1.sex = 'girl'
print(stu1.__dict__)

輸出結果為:

16
張三
李四
姓名:李四黑忱,年齡:18
人類的數(shù)量:16
人類毆打小動物宴抚!
{'name': '李四', 'age': 18, '_Person__heiget': 180, 'sex': 'girl'}

6 方法的重寫

子類繼承父類,擁有父類的屬性和方法以后甫煞,還可以再添加自己的屬性和方法菇曲。

  • 1.添加方法和類的字段
    直接在子類中聲明相應的方法和字段

  • 2.添加對象屬性
    對象的屬性是通過繼承父類的init方法而繼承下來的如果想要在保留父類的對象的同事添加自己的對象屬性,需要在子類的init方法中通過super()去調用父類的方法抚吠。

  • 3.方法的重寫
    在子類中新實現(xiàn)父類的方法常潮,就是重寫
    方式一:直接覆蓋父類的實現(xiàn)
    方式二:保留父類的功能再添加其他功能

  • 4.類中方法的調用過程
    先去當前這個類中去找,沒有去父類中找楷力,找不到再去父類的父類中找喊式,依次類推,如在基類中都沒有找到才崩潰萧朝。在第一次找到的位置去調用岔留。
    注意:使用super的時候必須是通過super()來代替父類或者是父類對象

以創(chuàng)建的動物類作為父類,具體實現(xiàn)代碼如下所示:

class Animal:
    """動物類"""
    # 動物的基本屬性
    def __init__(self):
        self.age = 0
        self.sex = '雌'
    # 動物的共同的行為
    def shout(self):
        print('嗷嗷叫~')

創(chuàng)建化貓類和狗類繼承自動物類并實例化:

class Cat(Animal):
    """貓類"""
    def __init__(self):
        # 通過super調用init方法检柬,在貓類的基礎屬性中添加屬性
        super().__init__()
        self.name = '小花'

    food = '魚'
    def shout(self):
        print('喵喵喵~')


class Dog(Animal):
    def shout(self):
        # 通過super()調用父類的方法献联,保留父類功能
        super().shout()
        print('汪汪汪~')

cat1 = Cat()
print(cat1.age)
print(cat1.name)
cat1.shout()

dog1 = Dog()
dog1.shout()

輸出結果為:

0
小花
喵喵喵~
嗷嗷叫~
汪汪汪~

7 運算符的重載

如果希望類的對象支持相應的運算符操作(例如:+、-何址、*里逆、/、>用爪、<等)原押,就必須實現(xiàn)相應的魔法方法。
這個過程就叫運算符的重載项钮。

+:__add__
>:__gt__

一般情況需要對>或者<進行重載班眯,重載后可以通過sort方法直接對對象的列表進行排序。

具體使用方法如下代碼所示:

class Student:

    def __init__(self, name='', age=0, score=0):
        self.name = name
        self.age = age
        self.score = score

    # self:+前面的對象
    # other:+后面的對象
    def __add__(self, other):
        return self.score + other.score

    # 重載 > 符號(大于小于符號重載一次都能用)
    def __gt__(self, other):
        return self.age > other.age

    # 重寫魔法方法__str__烁巫,用來定制對象的打印樣式
    def __str__(self):
       return 'Student: %s %d %d' % (self.name, self.age, self.score)

實例化人類:

   stu1 = Student('小明', 18, 90)
    stu2 = Student('小紅', 19, 99)

    print(stu1 + stu2)
    print(stu1 > stu2)
    print(stu1)

輸出結果為:

189
False
Student: 小明 18 90

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末署隘,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子亚隙,更是在濱河造成了極大的恐慌磁餐,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異诊霹,居然都是意外死亡羞延,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門脾还,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伴箩,“玉大人,你說我怎么就攤上這事鄙漏∴脱瑁” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵怔蚌,是天一觀的道長巩步。 經(jīng)常有香客問我,道長桦踊,這世上最難降的妖魔是什么椅野? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮籍胯,結果婚禮上竟闪,老公的妹妹穿的比我還像新娘。我一直安慰自己芒炼,他們只是感情好瘫怜,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著本刽,像睡著了一般鲸湃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上子寓,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天暗挑,我揣著相機與錄音,去河邊找鬼斜友。 笑死炸裆,一個胖子當著我的面吹牛,可吹牛的內容都是我干的鲜屏。 我是一名探鬼主播烹看,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼洛史!你這毒婦竟也來了惯殊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤也殖,失蹤者是張志新(化名)和其女友劉穎土思,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡己儒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年崎岂,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闪湾。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡冲甘,死狀恐怖,靈堂內的尸體忽然破棺而出途样,到底是詐尸還是另有隱情损合,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布娘纷,位于F島的核電站,受9級特大地震影響跋炕,放射性物質發(fā)生泄漏赖晶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一辐烂、第九天 我趴在偏房一處隱蔽的房頂上張望遏插。 院中可真熱鬧,春花似錦纠修、人聲如沸胳嘲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽了牛。三九已至,卻和暖如春辰妙,著一層夾襖步出監(jiān)牢的瞬間鹰祸,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工密浑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蛙婴,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓尔破,卻偏偏與公主長得像街图,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子懒构,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內容

  • 這是『056』李婷365日寫作計劃第17天的寫作內容 前期回顧 你還記得上期的剁手黨嗎痴脾?一個每月需要支付幾千美元信...
    婷婷玉立水墨畫閱讀 657評論 2 5
  • 這么熱的天颤介,竟然停電了啊? 這是七月火熱的夏天滚朵,渾身直冒汗冤灾。沒有電,這像是回到了解放前霸韵吨!借助應急...
    白豐閣閱讀 151評論 4 2
  • 上一節(jié)我們講到了參考橢球體,現(xiàn)在我們基于參考橢球體來說明地理坐標系移宅。 地理坐標系對參考橢球體而言归粉,其圍繞旋轉的軸叫...
    GIS名人談閱讀 971評論 0 0
  • Write a program to solve a Sudoku puzzle by filling the e...
    關瑋琳linSir閱讀 343評論 0 6
  • 我是卓佐糠悼,這是我每天一篇原創(chuàng)文章NO.75 【“小搗蛋”】 之前,小陽光脖子長了痱子浅乔,每天涂痱子膏【笪梗現(xiàn)在痱子好了也...
    迎慶心烘焙閱讀 670評論 0 2