2019-03-21

內(nèi)置類屬性

  • 創(chuàng)建類的時(shí)候,系統(tǒng)默認(rèn)為我們添加的類的屬性
class Person:
    """說(shuō)明文檔:人類"""
    # 類的字段
    number = 61

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

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

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

    @staticmethod
    def static_func():
        print('靜態(tài)方法')
    # 系統(tǒng)自帶的魔法,可以定制當(dāng)前類的對(duì)象的打印內(nèi)容。實(shí)現(xiàn)這個(gè)函數(shù)的時(shí)候要求有一個(gè)字符串類型的返回值
    # 影響單獨(dú)打印對(duì)象的效果
    # def __str__(self):
    #     return str(self.__dict__)[1:-1]

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

    # def __repr__(self):
    #     return '<%s.%s object at %s>' % (self.__class__.__module__, self.__class__.__name__, hex(id(self)))


p1 = Person('小明', 18, '男')
print(p1)     #'name': '小明', 'age': 18, 'gender': '男'
p2=Person('小花',18)
print([p1,p2])     #[<'name': '小明', 'age': 18, 'gender': '男'>, <'name': '小花', 'age': 18, 'gender': '女'>]
  • _ _ name _ _ 字段
"""
類.__name__   - 獲取類的名字
"""
print(Person.__name__,  type(Person.__name__))    # Person <class 'str'>
  • _ _ doc _ _ 字段
"""
類.__doc__     - 獲取類的說(shuō)明文檔
"""
print(Person.__doc__)
  • _ _ class _ _ 對(duì)象屬性
"""
對(duì)象.__class__   - 獲取對(duì)象對(duì)應(yīng)的類(你這個(gè)對(duì)象是哪個(gè)類的對(duì)象)
"""
print(p1.__class__)
  • _ _ dict _ _ 字段/對(duì)象屬性
"""
類.__dict__      -  獲取類中所有的字段和對(duì)應(yīng)的值,以字典的形式返回(了解)
對(duì)象.__dict__     -  獲取對(duì)象中所有的屬性和對(duì)應(yīng)的值,以字典的形式返回(掌握)
"""
print(Person.__dict__)
print(p1.__dict__)
  • _ _ module _ _ 字段
"""
類.__module__      - 獲取指定的類聲明在哪個(gè)模塊中,返回模塊名(獲取類所在的模塊的__name__屬性的值)
"""
print(Person.__module__)
  • _ _ bases _ _ 字段
"""
類.__bases__     - 返回當(dāng)前類的所有父類
"""
print(Person.__bases__)

slots魔法

"""
可以通過(guò)給__slots__字段賦值來(lái)約束當(dāng)前類有哪些對(duì)象屬性;

當(dāng)在類中給__slots__賦值后,當(dāng)前類的對(duì)象的__dict__屬性無(wú)效
"""


class Dog:
    __slots__ = ('name', 'age', 'gender', 'name1')

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


dog = Dog('大黃')


print(dog.__dict__)

私有保護(hù)

"""
1、高級(jí)語(yǔ)言
在很多的高級(jí)面向?qū)ο笳Z(yǔ)言中,會(huì)將屬性和方法分為公開(kāi)的(在類的外部可以使用)、
私有的(只能在類的內(nèi)部使用,不能被繼承)、受保護(hù)(只能在類的內(nèi)部使用,可以被繼承)的三類
2.python
python中類的內(nèi)容本質(zhì)上全部都是公開(kāi)的。私有和公開(kāi)都只是約定
1)私有化 - a.內(nèi)容只能在類的內(nèi)部使用,不能在外面使用。(效果)
          b.在類中的方法名或者屬性名前加'__',那么對(duì)應(yīng)的屬性和方法就會(huì)變成私有的。 (怎么私有化) 
          c.當(dāng)聲明類的時(shí)候在名字前加'__',內(nèi)部會(huì)在這個(gè)基礎(chǔ)前面再加'_類名'。    (私有化的本質(zhì))  
        
2)屬性保護(hù) - 可通過(guò)在對(duì)象屬性名前加'_',把這個(gè)屬性標(biāo)記成收保護(hù)類型;為了告訴別人這個(gè)屬性在使用的時(shí)候,
            不要直接用,而是通過(guò)getter和setter來(lái)使用    
a.getter - 獲取對(duì)象的屬性值之前想要干點(diǎn)兒別的事情,那么就給這個(gè)屬性添加getter
第一步: 在對(duì)應(yīng)的屬性名前加'_'
第二步: 在@property后面聲明一個(gè)函數(shù),這個(gè)函數(shù)沒(méi)有參數(shù),有一個(gè)返回值,并且函數(shù)名是屬性名去掉'_'
第三步: 獲取屬性值的時(shí)候,通過(guò)'對(duì)象.屬性名去掉下劃線'去獲取屬性的值


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


3.拋出異常: 
a.語(yǔ)法:
raise 異常類型 

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

4.自定義異常類型:寫一個(gè)類繼承Exception,然后重寫__str__方法來(lái)自定義錯(cuò)誤信息。

"""
class WeekValueError(Exception):
    def __str__(self):
        return '星期的值只能是1-7的整數(shù)!'


# raise WeekValueError



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


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


# 練習(xí): 給age屬性添加getter和setter,獲取年齡的時(shí)候拿到年齡值,和這個(gè)年齡對(duì)應(yīng)的階段;
# 給age賦值的時(shí)候,必須是整數(shù),并且范圍在0-150。如果不滿足要求報(bào)錯(cuò):AgeError
    @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對(duì)應(yīng)的方法
print(p1.week)       # 本質(zhì)是在調(diào)用getter對(duì)應(yīng)的方法

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

私有化

# ===============私有化==============


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__)

什么是繼承: 讓子類直接擁有父類所有的屬性和方法

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

怎么繼承

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

子類中添加內(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對(duì)象方法:', 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__)
# 使用父類繼承下來(lái)的屬性和方法
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)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ··· python 1.內(nèi)置類屬性 class Person:"""說(shuō)明文檔:人類"""# 類的字段number...
    曹哥_7d59閱讀 235評(píng)論 0 0
  • python 關(guān)于面對(duì)對(duì)象 面向?qū)ο?關(guān)于對(duì)面向?qū)ο蟮睦斫?,我認(rèn)為就是一種資源整合和工具思維。比如說(shuō)做一件事,不用...
    陽(yáng)光燦爛的饅頭閱讀 279評(píng)論 0 0
  • 1、設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式,并簡(jiǎn)要敘述? 設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類...
    方白羽lw閱讀 871評(píng)論 0 0
  • 塊元素和內(nèi)聯(lián)元素 塊元素: 所謂的塊元素就是會(huì)獨(dú)占一行的元素?zé)o論它的內(nèi)容有多少,它都會(huì)獨(dú)占一整行 常見(jiàn)的塊元素:d...
    呂若凡閱讀 396評(píng)論 0 0
  • 奉子成婚,遠(yuǎn)嫁?;楹笈c婆婆無(wú)休止的爭(zhēng)吵,與丈夫無(wú)止境的冷戰(zhàn)。戰(zhàn)爭(zhēng)的硝煙逐漸熄滅,筋疲力盡的她最后選擇凈身出戶。 實(shí)...
    黃山姑娘閱讀 478評(píng)論 2 5

友情鏈接更多精彩內(nèi)容