Day15 - 總結(jié)

1. 什么是內(nèi)置類屬性

????聲明類的時(shí)候系統(tǒng)自動(dòng)添加的屬性(可能是字段也可能是對(duì)象屬性)

import json
class Person:
    """
    說明文檔: 人類
    num - 人類的數(shù)量
    name - 人的名字
    """
    num = 61

    # 注意: 如果設(shè)置了__slots__的值适篙,那么當(dāng)前類的對(duì)象就不能使用__dict__屬性

    # __slots__ = ('name', 'gender', 'age')

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

    def eat(self,food):
        print('%s在吃%s' % (self.name, food))

1.1 定制當(dāng)前類的對(duì)象的打印

    # 1) 重寫__str__方法, 這個(gè)方法的返回值就是對(duì)應(yīng)的打印結(jié)果(類型必須是字符串)
    # def __str__(self):
    #     # return '姓名:{}, 年齡:{}, 性別:{}'.format(self.name, self.age, self.gender)
    #     return '<'+str(self.__dict__)[1:-1]+'>'

    # 2)重寫 __repr__方法吏饿,這個(gè)方法的返回值就是對(duì)應(yīng)的打印結(jié)果(類型必須是字符串)
    def __repr__(self):
        # return '姓名:{}, 年齡:{}, 性別:{}'.format(self.name, self.age, self.gender)
        # <'name': '小明', 'gender': '男', 'age': 18>
        return '<' + str(self.__dict__)[1:-1] + '>'
        # return 'abc'

1.2 name

#類的字段; 類.__name__  - 獲取類的名字(字符串)
print(type(Person), Person)
print(type(int))
print(Person.__name__)

1.3 doc

"""
類的字段; 類.__doc__   - 獲取類的說明文檔
"""
print(Person.__doc__)
print(int.__doc__)

1.4 class

"""
對(duì)象屬性; 對(duì)象.__class__   -  獲取對(duì)象對(duì)應(yīng)的類,返回的是類
         (和type(對(duì)象)功能一樣)
"""
print(p1.__class__)
print(type(p1))
# type1 = p1.__class__
type1 = type(p1)
print(type1.__name__)
p2 = type1('小花', '女', 17)
print(p2.name, p2.gender, p2.age)

1.5 dict (將對(duì)象轉(zhuǎn)換成字典)

"""
對(duì)象屬性; 對(duì)象.__dict__  - 將對(duì)象所有的屬性和對(duì)應(yīng)的值轉(zhuǎn)換成一個(gè)字典中的鍵值對(duì)(一個(gè)對(duì)象對(duì)應(yīng)一個(gè)字典)
類的字段; 類.__dict__  - 將類轉(zhuǎn)換成一個(gè)字典,字典中的元素是類中所有的字段和對(duì)應(yīng)的值
"""
print(p1.__dict__)
print(Person.__dict__)
print('p1:', p1)
print('p2:', p2)

persons = [p1, p2]
print(persons)

1.6 module

"""
類的字段; 類.__module__  -  獲取當(dāng)前類是在哪個(gè)模塊中聲明的(返回的是模塊的名字)
"""
print(Person.__module__)
print(bool.__module__)

1.7 bases

"""
類的字段; 類.__bases__  -  獲取當(dāng)前類的父類(返回的是一個(gè)元祖)
"""
print(Person.__bases__)


# 練習(xí): 將字典轉(zhuǎn)換成對(duì)象
with open('data', 'r', encoding='utf-8') as f:
    content = json.loads(f.read())
    datas = content['data']


class Data:
    def __init__(self, dict1: dict):
        for key in dict1:
            setattr(self, key, dict1[key])

    def __repr__(self):
        return '<'+str(self.__dict__)[1:-1]+'>'


for item in datas:
    data = Data(item)
    print(data.name, type(data))
    # print(data)

2. 訪問權(quán)限: 公開、保護(hù)勺良、私有

????公開 - 公開的屬性和方法在類的內(nèi)部、外部能夠使用嗤瞎,也能被繼承
????保護(hù) - 保護(hù)的屬性和方法在類的內(nèi)部能夠使用欧引、外部不能使用,可以被繼承
????私有 - 私有的屬性和方法只能在類的內(nèi)部使用倔韭、外部不能使用术浪,也不能被繼承

2.1 python中屬性和方法的訪問權(quán)限

????python類中所有的屬性和方法本質(zhì)都是公開的;
????私有化是假私有化寿酌,只是提示程序員這個(gè)屬性或者方法在外部不能要使用胰苏,也不要去繼承

????怎么私有化: 在需要私有化的屬性名或者方法名前加' __ '(注意:不能以' __ '結(jié)尾!)
????python私有化的原理: 在私有的屬性和方法前加了'_類名'

class Person:
    __num = 61

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

    def eat(self,food='米飯'):
        print('%s在吃%s' % (self.name, food))
        print('內(nèi)部:', Person.__num)
        self.func1()

    def func1(self):
        print('函數(shù)')
        print(self.__age)
        self.__func2()

    def __func2(self):
        print('私有函數(shù)')


p1 = Person('xiaoming', 20)
# print(Person.num, p1.name, p1.age)
# p1.eat()
# p1.func1()
# print(Person.__num)    # AttributeError: type object 'Person' has no attribute '__num'
# p1.eat()

# print(p1.__age)   # AttributeError: 'Person' object has no attribute '__age'
p1.func1()
# p1.__func2()   # AttributeError: 'Person' object has no attribute '__func2'


print(p1.__dict__)
print(p1._Person__age)
p1._Person__func2()

3. 什么是getter和setter

????當(dāng)我們需要在獲取屬性值之前做點(diǎn)別的事情就需要給這個(gè)屬性添加getter醇疼;
????當(dāng)需要給屬性賦值之前做別的事情硕并,就需要給這個(gè)屬性添加setter

3.1 給屬性添加getter

???? 1) 屬性命名的時(shí)候前面加'_'
???? 2) 在@property裝飾器的后面聲明一個(gè)對(duì)象方法
????????a.將屬性去掉下劃線作為方法名
????????b.方法除了self以外不需要其他參數(shù)
????????c.函數(shù)的返回值就是獲取這個(gè)屬性的時(shí)候得到的值
???? 3) 在外部使用屬性的時(shí)候法焰,通過'對(duì)象.不帶下滑的屬性'去使用

注意: 獲取屬性值的時(shí)候,就會(huì)自動(dòng)去調(diào)用getter對(duì)應(yīng)的函數(shù)

3.2 給屬性添加setter

屬性添加setter之前必須先添加getter

????1) 保證屬性名前有'_'
????2) 在@getter名.setter后面聲明對(duì)象方法
????????a.將屬性去掉下劃線作為方法名
????????b.需要一個(gè)self以外的參數(shù)
????????c.不需要返回值
????3) 在外部使用屬性的時(shí)候倔毙,通過'對(duì)象.不帶下滑的屬性'去使用

注意: 當(dāng)給屬性賦值的時(shí)候壶栋,實(shí)質(zhì)是調(diào)用setter對(duì)應(yīng)的方法
class Person:
    count = 0

    def __init__(self, name, age, gender):
        self.name = name
        self._age = age
        self._gender = 1
        self._week = 3

    # 添加getter
    @property
    def week(self):
        if self._week == 0:
            return '星期天'
        elif self._week == 1:
            return '星期一'
        elif self._week == 2:
            return '星期二'
        elif self._week == 3:
            return '星期三'
        elif self._week == 4:
            return '星期四'
        elif self._week == 5:
            return '星期五'
        elif self._week == 6:
            return '星期六'

    @property
    def age(self):
        Person.count += 1
        print('年齡值被訪問!!!!')
        return self._age

    @age.setter
    def age(self, value):
        print('年齡值被修改!')
        if not isinstance(value, int):
            raise ValueError
        if not 0 <= value <= 200:
            raise ValueError
        self._age = value

    @property
    def gender(self):
        if self._gender == 1:
            return '女'
        return '男'

    @gender.setter
    def gender(self, value):
        raise ValueError


p1 = Person('xiaoming', 18, '男')
# p1.age = 1908
# print(p1.age)
# print(p1.name, p1.age, p1.gender, p1.week)
print(p1.week)    # 這兒實(shí)質(zhì)是在調(diào)用week方法獲取返回值


p2 = Person('小花', 20, '女')
p2._week = 5
print(p2.week)

print(p1.age)        # p1.age()
age1 = p1.age
print(p2.age)     # p2.age()

p1.age = 67      # p1.age(200)

print(p1.gender)
# p1.gender = '男'


# 練習(xí): 寫一個(gè)矩形類
# 有屬性: 長(zhǎng)普监、寬贵试、面積、周長(zhǎng)
# 要求從生活的角度看這個(gè)矩形
class WriteError(Exception):
    def __str__(self):
        return '修改只讀屬性!'


class Rect:
    def __init__(self, length, width):
        if isinstance(length, int) or isinstance(length, float):
            self._length = length
        else:
            raise ValueError
            # self._length = 0

        self._width = width
        self._area = 0
        self.perimeter = 0

    @property
    def length(self):
        return self._length

    @length.setter
    def length(self, value):
        if not (isinstance(value, int) or isinstance(value, float)):
            raise ValueError

        if value < 0:
            raise ValueError

        self._length = value

    @property
    def area(self):
        self._area = self._length * self._width
        return self._area

    @area.setter
    def area(self, value):
        raise WriteError


r1 = Rect(100, 300)
print(r1.area)

r1.length = 20
print(r1.area)
# r1.area = 100

r2 = Rect('abc', 'ui')

4. 類中的函數(shù)

????類中的方法分為: 對(duì)象方法凯正、類方法和靜態(tài)方法

????1) 對(duì)象方法
????????a.怎么聲明: 直接聲明
????????b.怎么調(diào)用: 用對(duì)象來調(diào)用
????????c.特點(diǎn): 有指向當(dāng)前對(duì)象的self
????????d.什么時(shí)候用:如果實(shí)現(xiàn)函數(shù)的功能需要用到對(duì)象屬性毙玻,就使用對(duì)象方法

????2) 類方法
????????a.怎么聲明: 聲明在@classmethod后面
????????b.怎么調(diào)用: 用類來調(diào)用, '類.類方法()'
????????c.特點(diǎn): 有自帶的參數(shù)cls,表示當(dāng)前類; 這個(gè)參數(shù)在調(diào)用的時(shí)候不用傳參廊散,系統(tǒng)會(huì)自動(dòng)將當(dāng)前類傳給它桑滩;
????????cls:誰調(diào)用就指向誰(如果是對(duì)象指向的是對(duì)象對(duì)應(yīng)的類)
????????d.什么時(shí)候用: 如果實(shí)現(xiàn)函數(shù)的功能不需要對(duì)象屬性,但是需要類的字段, 就使用類方法

????3) 靜態(tài)方法
????????a.怎么聲明: 聲明在@staticmethod后面
????????b.怎么調(diào)用: 通過類來調(diào)用, '類.靜態(tài)方法()'
????????c.特點(diǎn): 沒有默認(rèn)參數(shù)
????????d.什么時(shí)候用: 實(shí)現(xiàn)函數(shù)的功能既不需要類也不需要對(duì)象允睹,就使用靜態(tài)方法

class Person:
    num = 61

    def __init__(self, name: str, age: int, gender: str):
        self.name = name
        self.age = age
        self.gender = gender

    def eat(self, food: str):
        # 對(duì)象能做的事情运准,self都能做
        print(self.name+'在吃'+food)

    @classmethod
    def func1(cls):
        # 類能做的事情,cls都能做
        print(cls)
        t = cls('a', 10, 'b')
        print('t:',t)
        print(cls.num)
        print('這是一個(gè)類方法!')

    @staticmethod
    def func2():
        print('這是一個(gè)靜態(tài)方法!')
        print(Person.num)

    def func3(self):
        print('這是一個(gè)函數(shù)!', self.name)

    def func4(self):
        print(self.age, Person.num)


Person.func1()
print(Person)

# p1 = Person('夏明', 90, '男')
# p1.func1()

Person.func2()


p1 = Person('夏明', 90, '男')
p1.func4()


class Student(Person):
    num = 10

    @staticmethod
    def func2():
        print('這是一個(gè)靜態(tài)方法!')
        print(Student.num)


print('============1=============')
Student.func1()
Person.func1()

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

5. 什么是繼承

????繼承就是讓子類直接擁有父類的屬性和方法
????子類 - 繼承者
????父類/超類 - 被繼承者

5.1 怎么繼承

????1) 語法
????class 類名(父類1,父類2,..):
????????說明文檔
????????類的內(nèi)容

????2) 說明:
????????() - 固定寫法缭受,如果省略相當(dāng)于(object)
????????聲明類的時(shí)候如果沒有寫父類胁澳,默認(rèn)繼承object(object又叫基類)
????????父類 - 一個(gè)類的父類可以有多個(gè),但是一般情況下只有一個(gè)(支持多繼承)

class Person:
    num = 61

    def __init__(self):
        print('Person中init')
        self.name = '小明'
        self.age = 18
        self.gender = '男'
        self.__a = 10

    def eat(self, food='米飯'):
        print('{}在吃{}'.format(self.name, food))

    @classmethod
    def show(cls):
        print('人類的數(shù)量:%d' % cls.num)

    @staticmethod
    def func1():
        print('人類')

    def func2(self):
        print('我是'+self.name)


class Student(Person):
    num = 10

    def __init__(self):
        # 在子類中添加對(duì)象屬性米者,需要先通過super()去調(diào)用父類的__init__來繼承父類的對(duì)象屬性
        super().__init__()
        print('Student中init')
        self.study_id = '001'
        self.class1 = 'py1904'

    # 添加功能
    def study(self):
        print(self.name+'在好好學(xué)習(xí)!')

    @staticmethod
    def func1():
        print('學(xué)生')

    def func2(self):
        print('我是學(xué)生!')
        # 在子類中可以通過super()可以去調(diào)用父類的方法
        # 注意: super()只能在對(duì)象方法和類方法中使用
        super().func2()


stu1 = Student()
print(Student.num)
print(stu1.name, stu1.age, stu1.gender)
stu1.eat()
Student.show()
print(stu1.__dict__)
Student.func1()

stu1.func2()
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末韭畸,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蔓搞,更是在濱河造成了極大的恐慌胰丁,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喂分,死亡現(xiàn)場(chǎng)離奇詭異锦庸,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蒲祈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門甘萧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人讳嘱,你說我怎么就攤上這事幔嗦。” “怎么了沥潭?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)嬉挡。 經(jīng)常有香客問我钝鸽,道長(zhǎng)汇恤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任拔恰,我火速辦了婚禮因谎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘颜懊。我一直安慰自己财岔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布河爹。 她就那樣靜靜地躺著匠璧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咸这。 梳的紋絲不亂的頭發(fā)上夷恍,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音媳维,去河邊找鬼酿雪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侄刽,可吹牛的內(nèi)容都是我干的指黎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼州丹,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼袋励!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起当叭,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤茬故,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蚁鳖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體磺芭,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年醉箕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钾腺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡讥裤,死狀恐怖放棒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情己英,我是刑警寧澤间螟,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響厢破,放射性物質(zhì)發(fā)生泄漏荣瑟。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一摩泪、第九天 我趴在偏房一處隱蔽的房頂上張望笆焰。 院中可真熱鬧,春花似錦见坑、人聲如沸嚷掠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽不皆。三九已至,卻和暖如春戴尸,著一層夾襖步出監(jiān)牢的瞬間粟焊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工孙蒙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留项棠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓挎峦,卻偏偏與公主長(zhǎng)得像香追,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子坦胶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,101評(píng)論 1 32
  • 內(nèi)置函數(shù)屬性 1.聲明是內(nèi)置類屬性 聲明類的時(shí)候系統(tǒng)自動(dòng)添加的屬性(可能是字段也可能是對(duì)象屬性) 定制當(dāng)前類的對(duì)象...
    舉顆鳳梨閱讀 259評(píng)論 0 4
  • 什么是類透典,什么是對(duì)象類就是擁有相同功能相同屬性的對(duì)象的集合 抽象的概念對(duì)象是類的實(shí)例 類的聲明class 類名:...
    小逗比的奮斗史閱讀 139評(píng)論 0 0
  • 一、屬性: 本質(zhì)上顿苇,python中所有的屬性和方法都是公開的峭咒,在類的外部可以使用也可以被繼承 1.私有化 讓屬性和...
    墨2019418閱讀 280評(píng)論 0 0
  • 今天一整天凑队,泰安都飄著蒙蒙的細(xì)雨,寒冬幔翰,貌似真的要來了漩氨。 但今天又很暖,心暖遗增。給與我這份溫暖的叫惊,是食堂的大叔。 中...
    璞玉丁閱讀 121評(píng)論 0 0