day 14 class and object

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

創(chuàng)建類的時候,系統(tǒng)默認為我們添加的類的屬性

class Person:
   """說明文檔:人類"""
  # 類的字段
  number = 12
  # 對象屬性
  def __init__(self,name,age,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)自帶的魔法,可以定制當前類的對象的打印內(nèi)容。實現(xiàn)這個函數(shù)的時候要求有一個字符串類型的返回值
影響單獨打印對象的效果
    def __str__(self):
        return str(self.__dict__)[1:-1]

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

p1  =  Person('小明',18,'男')

1.name 字段

類.__name__   -   獲取類的名字

print (Person.__name__, type(Person.__name__))

2.doc 字段

類.__doc__     -   獲取類的說明文檔
print(Person.__doc__)

3.class 對象屬性

對象.__class__   -  獲取對象對應(yīng)的類
print(p1.__class__)

4.dict 字段/對象屬性

類.__dict__    -   獲取類中所有的字段和對應(yīng)的值,以字典的形式返回(了解)
對象.__dict__   -   獲取對象中所有的屬性和對應(yīng)的值,以字典的形式返回(掌握)
print(Person.__dict__)
print(p1.__dict__)

5.module 字段

類.__module__  -  獲取指定的類聲明在哪個模塊中,返回模塊名  (獲取類所在的模塊的__name__屬性的值)

print(Person.__module__)

6.bases 字段

類.__bases__   -   返回當前類的所有父類
print(Person.__bases__)

2.slots魔法

可以通過給__slots__字段賦值來約束當前類有哪些對象屬性;

當在類中給__slots__賦值后,當前類的對象的__dict__屬性無效


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

1、高級語言

在很多的高級面向?qū)ο笳Z言中,會將屬性和方法分為公開的(在類的外部可以使用)、
私有的(只能在類的內(nèi)部使用,不能被繼承)、受保護(只能在類的內(nèi)部使用,可以被繼承)的三類

2.python

python中類的內(nèi)容本質(zhì)上全部都是公開的。私有和公開都只是約定

1)私有化 - a.內(nèi)容只能在類的內(nèi)部使用,不能在外面使用。(效果)

    b.在類中的方法名或者屬性名前加'__',那么對應(yīng)的屬性和方法就會變成私有的。 (怎么私有化) 
    c.當聲明類的時候在名字前加'__',內(nèi)部會在這個基礎(chǔ)前面再加'_類名'。    (私有化的本質(zhì))  

2)屬性保護 - 可通過在對象屬性名前加'_',把這個屬性標記成收保護類型;為了告訴別人這個屬性在使用的時候,

        不要直接用,而是通過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方法來自定義錯誤信息。



# raise WeekValueError


# ===============保護==============
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__)

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

父類 - 被繼承者, 子類 - 繼承者
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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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

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