day14課堂總結(jié)

01-recode

1.類和對象的概念

類:擁有相同屬性和相同功能的對象的集合
對象: 類的實例

2.類的聲明

class 類名:
    類的內(nèi)容  

3.對象的創(chuàng)建

類()

4.對象方法

a.直接聲明在類中期升,并且自帶一個self參數(shù)
b.通過對象來調(diào)用: 對象.對象方法()
c.通過對象調(diào)用的時候陕赃,self不需要傳參饥努,系統(tǒng)會將當前對象傳給self

5.構(gòu)造方法和init方法

方法名和類名相同的方法就是構(gòu)造方法纠脾。專門用來創(chuàng)建對象的
當創(chuàng)建對象的時候犬缨,會自動調(diào)用init方法

6.對象屬性

a.聲明在init方法中的
b.self.屬性 = 值
c.對象.屬性

7.對象屬性的增刪改查

對象.屬性 / getattr(對象, '屬性名', 默認值)
對象.屬性 = 值   / setattr(對象, '屬性名', 值)
del 對象.屬性   / delattr(對象, '屬性名')
__slots__ = ('屬性名') - 約束當前類有哪些對象屬性

8.類的字段

聲明在類中,函數(shù)的外面的變量
# def Perosn(*args, **kwargs):
#     對象 = 開辟空間創(chuàng)建對象
#     對象.__init__(*args, **kwargs)
#     return 對象


class Person:
    # 注意: 如果給類的__slots__賦了值藻雪,那么這個類的對象的__dict__屬性就不能用了
    # __slots__ = ('name', 'age', 'sex')

    def __init__(self):
        self.name = '張三'
        self.age = 18
        self.sex = '男'


p1 = Person()
print(p1.__dict__)

p2 = Person()
p2.name = '李四'
print(p2.__dict__)



02-類方法和靜態(tài)方法

類中的方法分為:對象方法, 類方法和靜態(tài)方法
1.對象方法
a.直接聲明在類中
b.有默認參數(shù)self
c.通過對象去調(diào)用: 對象.對象方法()

2.類方法
a.在聲明前添加@classmethod
b.有默認參數(shù)cls, 調(diào)用的時候不需要給cls傳參涝动。系統(tǒng)會自動將調(diào)用當前類方法的類傳給cls。
  cls最終指向的是一個類胆描,類可以做的事情cls都可以做
c.通過類去調(diào)用: 類.類方法()


3.靜態(tài)方法
a.在聲明前添加@staticmethod
b.沒有默認參數(shù)
c.通過類去調(diào)用:類.類方法() 

4.對象方法瘫想、類方法和靜態(tài)的方法的選擇
a.什么時候使用對象方法:
當實現(xiàn)函數(shù)的功能需要用到對象的屬性的時候就使用對象方法

b.什么時候使用類方法:
實現(xiàn)函數(shù)的功能不需要對象的屬性,但是需要類的時候就使用類方法

c.什么時候使用靜態(tài)方法
實現(xiàn)函數(shù)的功能既不需要對象的屬性昌讲,也不需要類的時候国夜,就使用靜態(tài)方法

class Person():

    # 類的字段
    num = 61

    def __init__(self, name):
        self.name = name

    # 對象方法
    def eat(self, food):
        # print(Person.num)
        print('%s在吃%s' % (self.name, food))

    # 類方法
    @classmethod
    def destroy(cls):
        # cls = Person
        print('cls:',cls)
        print('人類破壞環(huán)境')

        # 可以用cls來創(chuàng)建對象
        p1 = cls('小明')
        p1.eat('面包')

        # 可以用cls使用類的字段
        print(cls.num)

        # 可以用cls調(diào)用類相關的方法

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


print('Person:', Person)
Person.destroy()
Person.hit_animal()

練習:

數(shù)學類,屬性:pi 功能:求兩個數(shù)的和, 求一個圓的面積

class Math:
    pi = 3.1415926

    @staticmethod
    def sum(num1, num2):
        return num1+num2

    @classmethod
    def circle_area(cls, r):
        return cls.pi * (r ** 2)

    # @staticmethod
    # def circle_area(r):
    #     return Math.pi * (r ** 2)


class YTMath(Math):
    pi = 3.14



print(Math.sum(10, 3.10))
print(Math.circle_area(2))

print(YTMath.circle_area(2))



03-私有化

1.私有化
在類中短绸,可以通過在屬性名前车吹,或者方法名前加__(注意:不能以__結(jié)尾),那么這個屬性或者方法就會變成私有的筹裕。
私有的屬性和方法在類的外部不能使用

class Person:
    __num = 100    # 私有的屬性
    __number__ = 200   # 不是私有屬性

    def __init__(self):
        self.name = '張三'
        self.__age = 18

    def __show_message(self):
        print(Person.__num)
        print('名字:', self.name, '年齡:', self.__age)

    def func1(self):
        self.__show_message()


# print(Person.__num)

p1 = Person()
print(p1.name)

# p1.__show_message()
p1.func1()

# print(p1.__age)

print(Person.__number__)
2.私有化原理
python中沒有真正的私有化, 不能從訪問權(quán)限上控制屬性和方法的使用。
只是在名字前有__但是沒有以__結(jié)尾的名字前再加了'_類名',導致不能直接通過原屬性和方法名進行訪問
class Dog:
    def __init__(self, name, color):
        self.__name = name
        self.__color = color


dog1 = Dog('大黃', '黃色')
print(dog1.__dict__)
# print(dog1.__name, dog1.__color)
print(dog1._Dog__name)



04-對象屬性getter和setter

1.getter和setter
如果希望在獲取對象屬性之前要做點兒別的事情礼搁,就給這個屬性添加getter饶碘;
如果希望在給對象屬性賦值之前做點兒別的事情,就給這個屬性添加setter

2.給對象屬性添加getter
a.屬性命名的時候馒吴,屬性名前加_; 例如:self._age = 0
b.聲明一個函數(shù),函數(shù)的名字是屬性名(不要下劃線),不需要額外參數(shù),有返回值瑟曲;并且函數(shù)前使用@property修飾饮戳。
  這個函數(shù)的返回值就是獲取屬性的結(jié)果
例如:
@property
def age(self):
    return  年齡相關值
  
c.當需要獲取屬性的時候通過對象.不帶下劃線的屬性;例如:對象.age


3.給對象屬性添加setter
想要給對象屬性添加setter洞拨,必須先給它添加getter
a.屬性命名的時候扯罐,屬性名前加_; 例如:self._age = 0
b.聲明一個函數(shù),函數(shù)的名字是屬性名(不要下劃線)烦衣,需要一個額外的參數(shù),不用返回值;
  并且函數(shù)前使用@getter名.setter修飾
例如:
@age.setter
def age(self, value):
    self._age = value
    
c.當需要給屬性賦值的時候歹河,通過對象.不帶下劃線的屬性來賦值;例如: 對象.age = 100

class Person:
    def __init__(self, name='小紅'):
        self.name = name
        self._age = 60
        self.sex = '男'

    # 這兒的age函數(shù)就是屬性_age的getter方法
    @property
    def age(self):
        if self._age < 1:
            return '嬰兒'
        elif self._age < 18:
            return '未成年'
        elif self._age < 50:
            return '中年'
        else:
            return '老年'

    # 這兒的age函數(shù)就是屬性_age的setter
    @age.setter
    def age(self, value):
        if not isinstance(value, int):
            print('年齡必須是整數(shù)!!!!')
            raise ValueError

        if not (0 <= value <= 100):
            print('年齡超出范圍!!!!')
            raise ValueError

        self._age = value


p1 = Person()
# print(p1.age)  # 希望取到的不是年齡值花吟,而是年齡對應的階段
# p1.age = '12'    # 存 0
# p1.age = '100'   # 150

# 這兒實質(zhì)是在調(diào)用_age的getter方法
print(p1.age)

# 這兒實質(zhì)是在調(diào)用_age的setter方法: p1.age(80)
p1.age = 80

練習:聲明一個時間類秸歧,有一個屬性是以秒的形式保存時間

不斷的輸入時間,以'XX:XX'的形式輸入衅澈。輸入多少個時間就保存多少個時間對象键菱。知道輸入end為止

class Time:
    def __init__(self):
        self._second= 0

    @property
    def second(self):
        return self._second

    # '01:11 - 71'
    @second.setter
    def second(self, value: str):
        times = value.split(':')
        self._second = int(times[0])*60 + int(times[1])

    """
    補充:打印自己聲明的類的對象的時候,默認打印的是:<模塊名.類名 object at 對象地址>
    如果不希望以默認的方式去打印對象今布,可以實現(xiàn)__repr__魔法方法经备。打印對象的時候就會打印這個方法的返回值
    
    這個函數(shù)的返回值必須是字符串
    """
    def __repr__(self):
        return '時間:'+ str(self.second)


"""
10:20   -> time.秒 = 620
1:20   ->  time.秒 = 80
"""
# times = []
# while True:
#     value = input('時間:')
#     if value == 'end':
#         break
#     # 創(chuàng)建對象,并且將輸入的內(nèi)容賦給時間
#     t = Time()
#     t.second = value
#     times.append(t)
#
# print(times)


class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    # def __repr__(self):
    #     return '[' + self.__class__.__module__+'.'+\
    #            self.__class__.__name__+' object at '+ hex(id(self))+']'
    def __repr__(self):
        # return 'name:%s, age:%d' % (self.name, self.age)
        return str(self.__dict__)[1:-1]


stu1 = Student('小明', 29)   # >>__main__.Student object at 0x1077a9550<<
stu2 = Student('小??', 18)   # name:小??, age:18
print(stu1, stu2)



05-類的繼承

1.繼承
python中的類支持繼承部默,并且支持多繼承侵蒙。
python中默認情況是繼承自object(object是python中所有類的基類)

a.什么是繼承
一個類可以繼承另外一個類,繼承者我們叫子類傅蹂,被繼承者叫父類纷闺。繼承就是讓子類直接擁有父類中的內(nèi)容

b.可以繼承哪些內(nèi)容
所有的屬性和方法都可以繼承
class Person(object):
    num = 61

    # 注意:__slots__對應的值不會被繼承
    __slots__ = ('name', 'age', 'sex')

    def __init__(self):
        self.name = '張三'
        self.age = 0
        self.sex = '男'

    def show_message(self):
        print('%s你好嗎?' % self.name)


# Student類繼承自Person類
class Student(Person):
    pass


# 創(chuàng)建學生對象
stu1 = Student()
# 對象屬性可以繼承
print(stu1.name, stu1.age, stu1.sex)

# 類的字段可以繼承
print(Student.num)

# 對象方法可以繼承
stu1.show_message()



p1 = Person()
# p1.color = '黃色'
stu1.color = '白色'
print(stu1.color)



06-添加方法

子類除了擁有從父類繼承下來的屬性和方法,還擁有屬于自己的屬性和方法

1.在子類中添加方法
a.添加一個新的方法
直接在子類中聲明其他的方法; 
添加后子類可以調(diào)用自己的方法也可以調(diào)用父類的方法贬派,但是父類不能調(diào)用子類的方法

b.重寫父類的方法: 重新實現(xiàn)父類的方法
完全重寫 - 覆蓋父類的功能  - 直接在子類中重新實現(xiàn)父類的方法
部分重寫 - 保留父類的功能急但,添加新的功能 - 在子類中實現(xiàn)父類方法的時候通過super()去調(diào)用父類的方法,
                                    再添加新的功能
注意:a.可以子類的方法中通過super()去調(diào)用父類的方法    
super(類, 對象) - 獲取對象中父類的部分(要求對象是這個指定的類的對象)  
b.靜態(tài)方法中不能使用super()

                         


c.類中方法的調(diào)用過程
通過對象或者類調(diào)用方法的時候搞乏,先看當前類中是否聲明過這個方法波桩,如果聲明過就直接調(diào)用當前類對應的方法;
如果當前類中沒有聲明過,會去找父類中有沒有聲明過這個方法请敦,聲明過就調(diào)用父類的方法;
如果父類中也沒有聲明過镐躲,就去找父類的父類...以此類推储玫,直到object中也沒有聲明過,程序才會崩潰
class Person:
    # 類的字段
    num = 61

    # 對象屬性
    def __init__(self):
        self.name = '張三'
        self.age = 0
        self.sex = '男'

    def fun1(self):
        print('Person的對象方法')

    # 方法
    def show_message(self):
        print('%s,你好嗎萤皂?' % self.name)

    @staticmethod
    def info():
        print('我是人類')


class Student(Person):

    def study(self):
        print('%s在學生' % self.name)

    @classmethod
    def message(cls):
        super().info()
        print('我是學生!')

    # 完全重寫
    @staticmethod
    def info():
        print('我是學生H銮睢!裆熙!')

    # 保留父類的功能
    def show_message(self):
        super().show_message()
        print('我去上學~')
        super().fun1()




# Student.info()



07-添加屬性

1.添加類的字段
直接在子類中添加新的字段

2.添加對象屬性
繼承對象屬性是通過繼承父類的init方法繼承下來的

如果想要在保留父類繼承下來的對象屬性的前提下端礼,添加新的對象屬性,
需要在子類的init方法中入录,通過super()去調(diào)用父類的init方法
class Person:
    num = 61

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


class Student(Person):
    number = 100

    def __init__(self, name):
        super().__init__(name)
        self.study_id = '001'


print(Student.number, Student.num)

stu1 = Student('小明')
print(stu1.name, stu1.age, stu1.study_id)

練習:

聲明一個動物類蛤奥,有屬性:年齡,顏色僚稿,類型凡桥。

要求創(chuàng)建動物對象的時候類型和顏色必須賦值,年齡可以賦值也可以不賦值

聲明一個貓類蚀同,有屬性:年齡缅刽,顏色,類型, 愛好

要求創(chuàng)建貓對象的時候蠢络,顏色必須賦值衰猛,年齡和愛好可以賦值也可以不賦值,類型不能賦值


class Aniaml:
    def __init__(self, type, color, age=0):
        self.type = type
        self.color = color
        self.age = age


class Cat(Aniaml):
    def __init__(self, color, age=0, hobby=''):
        super().__init__('貓科', color, age)
        self.hobby = hobby


an1 = Aniaml('犬科', '黃色')
an2 = Aniaml('犬科', '黃色', 10)

cat1 = Cat('白色')
cat2 = Cat('灰色', 3)
cat3 = Cat('灰色', hobby='睡覺')
cat4 = Cat('灰色', 3, '睡覺')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谢肾,一起剝皮案震驚了整個濱河市腕侄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芦疏,老刑警劉巖冕杠,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酸茴,居然都是意外死亡分预,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門薪捍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笼痹,“玉大人,你說我怎么就攤上這事酪穿〉矢桑” “怎么了?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵被济,是天一觀的道長救赐。 經(jīng)常有香客問我,道長只磷,這世上最難降的妖魔是什么经磅? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任泌绣,我火速辦了婚禮,結(jié)果婚禮上预厌,老公的妹妹穿的比我還像新娘阿迈。我一直安慰自己,他們只是感情好轧叽,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布苗沧。 她就那樣靜靜地躺著,像睡著了一般炭晒。 火紅的嫁衣襯著肌膚如雪崎页。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天腰埂,我揣著相機與錄音,去河邊找鬼蜈膨。 笑死屿笼,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的翁巍。 我是一名探鬼主播驴一,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼灶壶!你這毒婦竟也來了肝断?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤驰凛,失蹤者是張志新(化名)和其女友劉穎胸懈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恰响,經(jīng)...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡趣钱,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了胚宦。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片首有。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖枢劝,靈堂內(nèi)的尸體忽然破棺而出井联,到底是詐尸還是另有隱情,我是刑警寧澤您旁,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布烙常,位于F島的核電站,受9級特大地震影響被冒,放射性物質(zhì)發(fā)生泄漏军掂。R本人自食惡果不足惜轮蜕,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蝗锥。 院中可真熱鬧跃洛,春花似錦、人聲如沸终议。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽穴张。三九已至细燎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間皂甘,已是汗流浹背玻驻。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留偿枕,地道東北人璧瞬。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像渐夸,于是被迫代替她去往敵國和親嗤锉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 這是16年5月份編輯的一份比較雜亂適合自己觀看的學習記錄文檔墓塌,今天18年5月份再次想寫文章瘟忱,發(fā)現(xiàn)簡書還為我保存起的...
    Jenaral閱讀 2,771評論 2 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,113評論 1 32
  • 沒有記錄就沒有發(fā)生。從每一天每一周每一月的匯總和反思中記錄自己的人生苫幢,泡在易效能實現(xiàn)時間和財富的自由访诱。 【金句】1...
    暖霞心理閱讀 128評論 0 0
  • 喵喵七閱讀 165評論 0 0
  • 擺正位置最重要 我很慶幸我在職場呆的不多,這對我來說是很幸運的事情态坦。 職場是更真實的社會盐数,活的太真實有時候容易讓人...
    林有朽木閱讀 944評論 1 11