day14筆記-ClassAndObject

一.recode

1.類的聲明
類是擁有相同屬性和相同功能的對象的集合

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

2.創(chuàng)建對象
對象 = 類()
3.(重點!)類中的內(nèi)容:對象方法藻懒、類方法迁酸、靜態(tài)方法;字段遮晚、對象屬性

"""
1) 方法  -  怎么聲明戏溺、特點渣蜗、怎么調(diào)用、什么時候用
對象方法:直接聲明在類中的函數(shù)旷祸;有默認(rèn)參數(shù)self耕拷;通過對象調(diào)用;實現(xiàn)函數(shù)功能需要用到對象屬性的時候
類方法:聲明前加@classmethod肋僧;有默認(rèn)參數(shù)cls斑胜;通過類調(diào)用控淡;實現(xiàn)函數(shù)功能不需要對象屬性嫌吠,需要類相關(guān)的時候
靜態(tài)方法:聲明前@staticmethod;沒有默認(rèn)參數(shù)掺炭;通過類調(diào)用辫诅;既不需要對象屬性,也不需要類相關(guān)操作

2)屬性  -  怎么聲明涧狮、怎么使用炕矮、什么時候用
字段:聲明在類里面,函數(shù)的外面者冤;通過類使用肤视;不會因為對象不同而不同的屬性聲明成字段
對象屬性:以‘self.屬性=值’的形式聲明在__init__方法中;通過對象使用;會因為對象不同而不同的屬性聲明成對象屬性
"""

4.對象屬性的增刪改查

"""
對象.屬性/getatter()  -  查
對象.屬性 = 值/ setatter()  -  增、改
"""
class Person:
    number = 100

    def __init__(self):
        self.name = '小明'

    def func1(self):
        # print(Person.number)
        print(self.name)

    @classmethod
    def func2(cls):
        print('cls:',cls)
        print(cls.number)

    @staticmethod
    def func3():
        print(Person)
        print(Person.number)


p1 = Person()
p1.func1()
# Person.func2()
# Person.func3()


class Student(Person):
    pass


Person.func3()
Person.func2()
print('============')
Student.func3()
Student.func2()

二.homework

三.property1

1.內(nèi)置類函數(shù)
創(chuàng)建類的時候,系統(tǒng)默認(rèn)為我們添加的類的屬性

class Person:
    """說明文檔:人類"""
    # 類的字段
    number = 61

    # 對象屬性
    def __init__(self, name, age=0, gender='女'):
        self.name = name
        self.age = age
        self.gender = gender

    # ============方法==========
    def object_func(self):
        print('對象方法: '+self.name)

    @classmethod
    def class_func(cls):
        print('類方法: ', cls.number)

    @staticmethod
    def static_func():
        print('靜態(tài)方法')

# 系統(tǒng)自帶的魔法,可以定制當(dāng)前類的對象的打印內(nèi)容.實現(xiàn)這個函數(shù)的時候# 要求有一個字符串類型的返回值
影響單獨打印對象的效果

def __str__(self):
    return str(self.__dict__)[1:-1]

# 對象作為元素的時候的打印效果
def __repr__(self):
    return '<'+str(self.__dict__)[1:-1]+'>'

p1 = Person('小明', 18, '男')
# 1.__name__    字段
"""
類.__name__   -  獲取類的名字
"""
print(Person.__name__, type(Person.__name__))   #  Person <class 'str'>

2.__doc__     字段
"""
類.__doc__    -  獲取類的說明文檔
"""
print(Person.__doc__)   #  人類

3.__class__    對象屬性
"""
對象.__class__   -  獲取對象對應(yīng)的類(你這個對象是哪個類的對象)
print(p1.__class__)  #  <class '__main__.Person'>

"""
4.__dict__   字段/對象屬性
"""
類.__dict__  -  獲取類中所有的字段和對應(yīng)的值,以字典的形式返回(了解)
對象.__dict__  -  獲取對象中所有的屬性和對應(yīng)的值,以字典的形式返回(掌握)
"""
print(Person.__dict__)  
print(p1.__dict__)  #  {'name': '小明', 'age': 18, 'gender': '男'}

5.__module__   字段
"""
類.__module__  -  獲取指定的類聲明在哪個模塊中,返回模塊名(獲取類所在的模塊的__name__屬性的值)
"""
print(Person.__module__)  # __main__

6.__bases__   字段
"""
類.__bases__   -  返回當(dāng)前類的所有父類
"""
print(Person.__bases__)  # (<class 'object'>,)
class A(Person, int):
    pass


print(A.__bases__)

print('p1:', p1)

persons = [p1, Person('小花', 20)]
print(persons)

2.slots魔法

"""
可以通過給__slots__字符賦值來約束當(dāng)前類有哪些對象屬性;當(dāng)在類中給__slots__賦值后,當(dāng)前類的對象的__dict__屬性無效
"""
class Dog:
    __slots__ = ('name', 'age', 'gender', 'name1')

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


dog = Dog('大黃')

四.privateprotect

"""
1.高級語言
在很多的高級面向?qū)ο笳Z言中,會將屬性和方法分為公開的(在類的外部可以使用)涉枫、私有的(只能在類的內(nèi)部使用邢滑,不能被繼承)、受保護的(只能在類的內(nèi)部使用愿汰,可以被繼承)三類
2.python
python中類的內(nèi)容本質(zhì)上全部都是公開的困后。私有和公開都只是約定
1)私有化  - a.內(nèi)容只能在內(nèi)部使用,不能再外面使用(效果)
            b.在類中的方法名或者屬性名前加'__',那么對應(yīng)的屬性和方法就會變成私有的(怎么私有化)
            c.當(dāng)聲明類的時候在名字前加'__',內(nèi)部會在這個基礎(chǔ)前面加'_類名'(私有化的本質(zhì))

2)屬性保護  -  可通過在對象屬性前加'_',把這個屬性標(biāo)記成受保護類型;為了告訴別人這個屬性在使用的時候,不要直接用,而是通過getter和setter來使用
a. getter  -  獲取對象的屬性值之前想要干點別的事情,那么就給這個屬性添加getter
第一步: 在對應(yīng)的屬性名前加'_'
第二步: 在@property后面聲明一個函數(shù),這個函數(shù)沒有參數(shù),有一個返回值,并且函數(shù)名是屬性名去掉'_'
第三步: 獲取屬性值的時候,通過'對象.屬性名去掉下劃線'取獲取屬性的值

b.setter  -  給屬性賦值前干別的事情,就給這個屬性添加setter.(想要添加setter必須先有g(shù)etter)
第一步: 在對應(yīng)的屬性名前加'_'
第二步: 在@getter名.setter后面聲明一個函數(shù),這個函數(shù)需要一個參數(shù),沒有返回值,并且函數(shù)名是屬性去掉'_'
第三步: 給屬性賦值的時候,通過'對象.屬性名去掉下劃線=值'的方式賦值

3.拋出異常
a.語法:
raise 異常類型

b.說明:
raise  -  關(guān)鍵字
異常類型  -  可以是系統(tǒng)提供的異常類型,也可以自定義異常類型(必須繼承Exception)

4.自定義異常類型: 寫一個類繼承Exception,然后重寫__str__方法來自定義錯誤信息
"""
class WeekValueError(Exception):
    def __str__(self):
        return '星期的值只能是1-7的整數(shù)乐纸!'

# ===============保護==============
class AgeError(Exception):
    def __str__(self):
        return '年齡要求是整數(shù),并且范圍在0~150!'


class Person1:
    def __init__(self):
        self._age = 0
        self._week = 6

    @property
    def age(self):
        if self._age < 18:
            return self._age, '未成年'
        elif self._age < 30:
            return self._age, '成年'
        elif self._age < 50:
            return self._age, '中年'
        else:
            return self._age, '老年'

    @age.setter
    def age(self, x):
        if not isinstance(x, int):
            raise AgeError
        elif not 0 < x <= 150:
            raise AgeError
        self._age = x

    @property
    def week(self):
        weeks = ['周1', '周2', '周3', '周4', '周5', '周6', '周日']
        return weeks[self._week - 1]

    @week.setter
    def week(self, x):
        if not isinstance(x, int):
            raise ValueError
        elif not 1 <= x <= 7:
            raise ValueError
        self._week = x


p1 = Person1()


p1.week = 1          # 本質(zhì)是在調(diào)用setter對應(yīng)的方法
print(p1.week)       # 本質(zhì)是在調(diào)用getter對應(yīng)的方法

p1.age = 100
age, jieduan = p1.age
print(age, jieduan)

# 練習(xí): 給age屬性添加getter和setter,獲取年齡的時候拿到年齡值摇予,和這個年齡對應(yīng)的階段;
# 給age賦值的時候汽绢,必須是整數(shù),并且范圍在0-150侧戴。如果不滿足要求報錯:AgeError
print('===============私有化==============')
# ===============私有化==============


class Person:
    __number = 61

    def __init__(self, name, age=18):
        self.name = name
        self.__age = age

    def message(self):
        print(self.__age)

    def __func1(self):
        print(self.name)


p = Person('小明')
print(p.name)
# print(p._Person__age)
p.message()

# print(Person.__number)
# p.__func1()
print(p.__dict__)

五.inherit

父類 - 被繼承者, 子類 - 繼承者
python中所有的類都是直接或者間接的繼承object
2.怎么繼承

class 子類名(父類1,父類2,...)
    類的內(nèi)容

3.子類中添加內(nèi)容

1)添加字段和方法,直接添加


class Person(object):
    number = 61

    def __init__(self, name, age=0, gender='男'):
        # name = '小花'
        self.name = name
        self.age = age
        self.gender = gender
        self.__num = '0001'

    def fun1(self):
        print('Person對象方法:', self.name)

    @classmethod
    def func2(cls):
        print(cls.number)

    @staticmethod
    def func3():
        print('func3')


class Student(Person):
    flag = '學(xué)生宁昭!'

    def __init__(self, name):
        # name = '小花'
        # 在子類的方法中去調(diào)用父類的方法
        super().__init__(name)     #  super().__init__('小花')
        self.study_id = 'stu001'

    def fun1(self):
        super().fun1()
        print('子類的,func1')

    def study(self):
        print('%s在學(xué)習(xí)' % self.name)


stu = Student('小花')
print(stu.__dict__)
# 使用父類繼承下來的屬性和方法
print(Student.number)
print(stu.name)
stu.fun1()
Student.func2()
Student.func3()


# 使用自己的屬性和方法
print(Student.flag)
stu.study()


print(Person.__bases__)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市救鲤,隨后出現(xiàn)的幾起案子久窟,更是在濱河造成了極大的恐慌,老刑警劉巖本缠,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斥扛,死亡現(xiàn)場離奇詭異,居然都是意外死亡丹锹,警方通過查閱死者的電腦和手機稀颁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楣黍,“玉大人匾灶,你說我怎么就攤上這事∽馄” “怎么了阶女?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長哩治。 經(jīng)常有香客問我秃踩,道長,這世上最難降的妖魔是什么业筏? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任憔杨,我火速辦了婚禮,結(jié)果婚禮上蒜胖,老公的妹妹穿的比我還像新娘消别。我一直安慰自己,他們只是感情好台谢,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布寻狂。 她就那樣靜靜地躺著,像睡著了一般朋沮。 火紅的嫁衣襯著肌膚如雪蛇券。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天,我揣著相機與錄音怀读,去河邊找鬼诉位。 笑死,一個胖子當(dāng)著我的面吹牛菜枷,可吹牛的內(nèi)容都是我干的苍糠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼啤誊,長吁一口氣:“原來是場噩夢啊……” “哼岳瞭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蚊锹,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞳筏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后牡昆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體姚炕,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年丢烘,在試婚紗的時候發(fā)現(xiàn)自己被綠了柱宦。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡播瞳,死狀恐怖掸刊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情赢乓,我是刑警寧澤忧侧,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站牌芋,受9級特大地震影響蚓炬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姜贡,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一试吁、第九天 我趴在偏房一處隱蔽的房頂上張望棺棵。 院中可真熱鬧楼咳,春花似錦、人聲如沸烛恤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缚柏。三九已至苹熏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背轨域。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工袱耽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人干发。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓朱巨,卻偏偏與公主長得像,于是被迫代替她去往敵國和親枉长。 傳聞我的和親對象是個殘疾皇子冀续,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355

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