1. 程式人生 > >Python入門學習筆記————14(類相關內容)

Python入門學習筆記————14(類相關內容)

類的成員描述符(屬性)

  • 類的成員描述符是為了在類的成員屬性進行相關操作而創造的一種方式
    • get : 獲取屬性的操作
    • set : 修改或新增屬性的操作
    • delete : 刪除屬性的操作
  • 三種方法使用成員描述符
    • 使用類實現描述器
    • 使用屬性修飾符
    • 使用property函式
      • property(fget,fset,fdel,doc)
  • 修飾符都是為了對成員屬性進行相應的控制
    • 類的方式:適合多個類中的多個屬性共用一個描述符
    • property: 在當前類中使用,可以控制一個類中的多個屬性
    • 屬性修飾符:在當前類中使用,可控制一個類的一個屬性

In [7]:

 

#屬性案例
#當姓名屬性需要一至時,例如都需要大寫
class Student():
    def __init__(self,name,age):
        self.name = name
        self.age = age 
        #呼叫
        self.setName(name)
    def intro(self):
        print('My name is {0},I am {1}'.format(self.name,self.age))
    #定義名字大寫
    def setName(self,name):
        self.name = name.upper()
 
s1 = Student('haha',18)
s1.intro()
My name is HAHA,I am 18

In [27]:

 

#property案例
#姓名大寫,年齡整數
class Person():
    '''
    這是說明文件
    '''
    #函式名稱可以任意
    def fget(self):
        return self._name * 2
    def fset(self,name):
        self._name = name.upper()
 
    def fdel(self):
        self._name = "Noname"
 
    name = property(fget,fset,fdel,"對名字進行修改")
p1 = Person()
p1.name = 'haha'
print(p1.name)
HAHAHAHA

類的內建屬性

        __dict__:以字典的方式顯示類的成員組成
        __doc__:獲取類的文件資訊
        __name__:獲取類的名稱,如果在模組中使用,獲取模組的名稱
        __bases__:獲取莫各類的所有父類,以元組的方式顯示

In [31]:

 

#類的內建屬性
print(Person.__dict__)
print(Person.__doc__)
print(Person.__name__)
print(Person.__bases__)
{'__module__': '__main__', '__doc__': '\n    這是說明文件\n    ', 'fget': <function Person.fget at 0x7f683dacec80>, 'fset': <function Person.fset at 0x7f683daceb70>, 'fdel': <function Person.fdel at 0x7f683dace8c8>, 'name': <property object at 0x7f683d20e1d8>, '__dict__': <attribute '__dict__' of 'Person' objects>, '__weakref__': <attribute '__weakref__' of 'Person' objects>}

    這是說明文件
    
Person
(<class 'object'>,)

類的常用魔術方法

  • 魔術方法就是不需要人為呼叫的方法,基本是在特定的時刻自動觸發
  • 特徵,方法名被前後兩個下劃線包裹
  • 操作類
    • init:建構函式
    • new:物件例項化方法,此函式比較特殊,一般不需要使用
    • call:物件當函式使用的時候觸發
    • str:當物件被當做字串使用時
    • repr:返回字串
  • 描述符相關set,get,delete
  • 屬性操作相關
    • getattr:訪問一個不存在的屬性時觸發
    • setattr:對成員函式進行設定時觸發
      • 引數:
        • self用來獲取當前物件
        • 被設定的屬性名稱,以字串形式出現
        • 需要對屬性名稱設定的值
      • 作用:對屬性設定時進行驗證或者修改
      • 注意:在該方法中不能對屬性進行賦值操作,否則死迴圈
  • 運算類相關魔法方法
    • gt:進行大於判斷時觸發的函式
    • 引數:
      • self
      • 第二個引數是第二個物件
      • 返回值可以是任意值,推薦返回bool值

In [69]:

 

#__init__,__call__,__str__舉例
class A ():
    def __init__(self,name=0):
        print('我被呼叫了')
    def __call__(self,name=0):
        print('我被呼叫了啊啊啊') 
    def __call__(self):
        return '啊啊啊'
a =A()
a() #call的使用
我被呼叫了

Out[69]:

'啊啊啊'

In [39]:

 

# __getattr__
class A():
    name = 'hahaha'
    age = 18
    def __getattr__(self,name):
        print('沒有啊沒有啊')
        print(name)
a = A()
print(a.name)
print(a.addr)#類中沒有addr屬性
 
hahaha
沒有啊沒有啊
addr
None

In [44]:

 

#__setattr__案例
class Person():
    def __init__(self):
        pass
    def __setattr__(self,name,value):
        print('設定屬性:{0}'.format(name))
        #以下語句會導致死迴圈
        #self.name = value
        #此種情況,為避免死迴圈,規定統一呼叫父類魔法函式
        super().__setattr__(name,value)
p = Person()
print(p.__dict__)
p.age =18
{}
設定屬性:age

In [47]:

 

#__gt__案例
class Student():
    def __init__(self,name):
        self._name = name
    def __gt__(self,obj):
        print('{0}比{1}大嗎?'.format(self,obj))
        return self._name>obj._name
 
stu1 = Student('one')
stu2 = Student('two')
print(stu1>stu2)
<__main__.Student object at 0x7f683d13da58>比<__main__.Student object at 0x7f683d13da20>大嗎?
False

類和物件的三種方法

  • 例項方法
    • 需要例項化物件才能使用的方法,使用過程種可能需要截止物件的其他物件的方法完成
  • 靜態方法
    • 不需要例項化,通過類直接訪問
  • 類方法
    • 不需要例項化
  • (區別自行百度)

In [82]:

 

#案例
class Person():
    #例項方法
    def eat(self):
        print(self)
        print('eating')
    #類方法
    #類方法的第一個引數,一般命名為cls,區別於self
    @classmethod
    def play(cls):
        print(cls)
        print('playing')
    #靜態方法
    #不需要用第一個引數表示自身或者類
    @staticmethod
    def say():
        print('saying')
 
 
p = Person()
#例項方法
p.eat()
#類方法
Person.play()
p.play()
#靜態方法
Person.say()
p.say()
<__main__.Person object at 0x7f683d048780>
eating
<class '__main__.Person'>
playing
<class '__main__.Person'>
playing
saying
saying