day14-總結(jié)

1.類的聲明

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

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

2.創(chuàng)建對象

  • 對象 = 類()

3.(重點!)類中的內(nèi)容:對象方法、類方法、靜態(tài)方法;字段、對象屬性

  • 1)方法 - 怎么聲明、特點、怎么調(diào)用、什么時候用
    對象方法: 直接聲明在類中的函數(shù); 有默認參數(shù)self; 通過對象調(diào)用; 實現(xiàn)函數(shù)功能需要用到對象屬性的時候
    類方法:聲明前加@classmethod; 有默認參數(shù)cls; 通過類調(diào)用;實現(xiàn)函數(shù)功能不需要對象屬性,需要類相關(guān)操作的時候
    靜態(tài)方法:聲明前加@staticmethod; 沒有默認參數(shù); 通過類調(diào)用; 既不需要對象屬性,也不需要類相關(guān)操作

  • 2)屬性 - 怎么聲明、怎么使用、什么時候用
    字段: 聲明在類里面,函數(shù)的外面; 通過類來使用; 不會因為對象不同而不同的屬性聲明成字段
    對象屬性: 以'self.屬性 = 值'的形式聲明在init方法中; 通過對象使用; 會因為對象不同而不同的屬性聲明成對象屬性

4.對象屬性的增刪改查

  • 對象.屬性/getattr() - 查
  • 對象.屬性=值/setattr() - 增、改
  • del 對象.屬性/delattr() - 刪
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()

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

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

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

    # 對象作為元素的時候的打印效果
    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, '男')

1.name 字段

  • 類.name - 獲取類的名字
print(Person.__name__,  type(Person.__name__))    # Person <class 'str'>

2.doc 字段

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

3.class 對象屬性

  • 對象.class - 獲取對象對應的類(你這個對象是哪個類的對象)
print(p1.__class__)

4.dict 字段/對象屬性

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

5.module 字段

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

6.bases 字段

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


class A(Person, int):
    pass


print(A.__bases__)

print('p1:', p1)

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


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

  • 2)屬性保護 - 可通過在對象屬性名前加'_',把這個屬性標記成收保護類型;為了告訴別人這個屬性在使用的時候,
    不要直接用,而是通過getter和setter來使用

a.getter - 獲取對象的屬性值之前想要干點兒別的事情,那么就給這個屬性添加getter

  • 第一步: 在對應的屬性名前加'_'
  • 第二步: 在@property后面聲明一個函數(shù),這個函數(shù)沒有參數(shù),有一個返回值,并且函數(shù)名是屬性名去掉'_'
  • 第三步: 獲取屬性值的時候,通過'對象.屬性名去掉下劃線'去獲取屬性的值

b.setter - 給屬性賦值前干別的事情,就給這個屬性添加setter。(想要添加setter必須先有g(shù)etter)

  • 第一步: 在對應的屬性名前加'_'
  • 第二步: 在@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ù)!'


# 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對應的方法
print(p1.week)       # 本質(zhì)是在調(diào)用getter對應的方法

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

練習: 給age屬性添加getter和setter,獲取年齡的時候拿到年齡值,和這個年齡對應的階段;

給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 = '學生!'

    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在學習' % 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ā)布平臺,僅提供信息存儲服務。

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

  • 01.recode 1.類和對象的概念 類:擁有相同的功能和相同屬性的對象的集合對象:類的實例 2.類的聲明 cl...
    Gary134閱讀 266評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,621評論 1 32
  • property 內(nèi)置類屬性創(chuàng)建類的時候,系統(tǒng)默認為我們添加的類的屬性 slots魔法可以通過給slots字段賦值...
    膽小的小噴菇閱讀 318評論 0 0
  • 人生總是會有不期而遇的溫柔,也有不期而遇的失落。這點我深信不疑。 意外和驚喜到底哪個先到來,誰也不知道。一直相信萬...
    糖糖always閱讀 516評論 0 1
  • 讀書日,不知什么時候有了這個節(jié)日,在這個節(jié)日泛濫的時代,也不足為奇,其初心估計是為了勸導全民讀書,但更為動心的則是...
    書成的時光閱讀 555評論 0 2

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