1. 程式人生 > >Python學習:16.Python面對對象(三、反射,構造方法,靜態字段,靜態方法)

Python學習:16.Python面對對象(三、反射,構造方法,靜態字段,靜態方法)

xxx 基於 自動 sel pan style 參數 屬於 get

一、構造方法

在使用類創建對象的時候(就是類後面加括號)就自動執行__init__方法。

class A:
    def __init__(self):
        print(A)


class B:
    def __init__(self):
        print(B)

obj = A()


#雖然只是創建了obj對象,但是執行了__init__方法,輸出了A

Python中派生類可以繼承父類的構造方法

1.基於super()

遇到super()就表示去執行父類的xxx屬性

class A:
    def
__init__(self): print(A) self.tp = annimal class B(A): def __init__(self): print(B) super(B,self).__init__() #執行B父類中的__init__方法,這裏的self是obj
     #super裏的self不是傳入後面的__init__方法裏,而是直接傳入A中的__init__,這裏super會幫你傳遞參數
obj = B() 輸出結果: B A

2.通過父類的名稱執行父類的構造方法。

class A:
    def __init__(self):
        print(A)
        self.tp = annimal


class B(A):
    def __init__(self):
        print(B)
        A.__init__(self)
        #父類的名稱跟上__init__()

obj = B()    


輸出結果:
B
A

  這兩種方式中推薦super,使用第二中方法的時候,進行繼承父類的方法的時候,是你指定父類的方法,看起來比較亂,但是使用super的時候,沒有讓你指定父類的名稱,這種繼承時候就按照正常的繼承規則(上一節所講)來進行。

二、反射

利用反射查看面向對象的成員

根據字符串的形式去對象(某個模塊)操作其成員

class Foo:
    def __init__(self,name):
        self.name = name

    def show(self):
        print(Fshow)

r = hasattr(Foo,show)
print(r)
#查看Foo類中是否有show函數
obj = Foo(alexsel)
s = hasattr(obj,name)
print(s)
#查看obj對象裏name是否存在
t = hasattr(obj,show)
print(t)
#通過對象查看是否存在show這個函數

輸出結果:
True
True
True

  我們通過類進行查詢的時候,僅僅只能找到類中的屬性,但是我們通過類創建的對象查詢的時候,我們不但可以找到對象中的屬性(例如,self.name,直接在類中查詢找不到),還可以找到對象中的方法(例如show函數),因為對象中有一個指向類的指針,當通過對象進行查詢的時候,可以通過指針找到類中的屬性。

利用反射導入模塊、查找類、創建對象、查找對象中的字段

1.首先使用__import__導入文件

函數功能用於動態的導入模塊,主要用於反射或者延遲加載模塊。

__import__(module)相當於import module

2.使用getattr(所導入的文件名,類名)導入類

getattr根據字符串的形式去某個模塊中尋找東西

3.通過找到的類創建對象

4.獲取對象中的屬性

s2.py文件中的代碼

class Foo:
    def __init__(self,name):
        self.name = name

    def show(self):
        print(Fshow)

s1.py文件中的代碼

m = __import__(zp)

class_name = getattr(m,Foo)

obj = class_name(Alexsel)

val = getattr(obj,name)

print(val)


輸出結果:
Alexsel

三、靜態字段

靜態字段的作用,將每個對象裏存在的重復的東西,使用靜態字段在類中只需寫一份。

class Foo:

    annimal = Cat
    #這個是靜態字段,是在類中保存的

    def __init__(self,name):
        temp = Alexsel
        #普通字段,存放在對象中

    #普通方法,存放在類中
    def show(self):
        print(SH)

print(Foo.annimal)


輸出結果:
Cat

使用靜態字段的時候,優先使用類名訪問靜態字段。

四、靜態方法

  靜態方法是類中的函數,不需要實例。靜態方法主要是用來存放邏輯性的代碼,主要是一些邏輯屬於類,但是和類本身沒有交互,即在靜態方法中,不會涉及到類中的方法和屬性的操作。

class Foo:
    annimal = Cat

    def __init__(self):
        pass

    def show(self):
        print(SH)

    #裝飾器,使用這個裝飾器裝飾類中的一個方法,這個方法就變為靜態方法
    @staticmethod
    def out():
        print(out)


Foo.out()
#靜態方法中不需要傳遞self,所以訪問靜態方法優先使用類去訪問
obj = Foo()
obj.out()


輸出結果:
out
out

靜態方法可以讓我們不需要創建對象就可以執行類中的方法。

五、類方法

  類方法是將類本身作為對象進行操作的方法。他和靜態方法的區別在於:不管這個方式是從實例調用還是從類調用,它都用第一個參數把類傳遞過來

class Foo:
    annimal = Cat

    def __init__(self):
        pass

    def show(self):
        print(SH)

    #裝飾器,使用這個裝飾器裝飾類中的一個方法,這個方法就變為類方法
    @classmethod
    def out(cls):
        print(out,cls)


Foo.out()
#類方法,會自動將的類傳遞到類方法的cls中


輸出結果:
out <class __main__.Foo>

Python學習:16.Python面對對象(三、反射,構造方法,靜態字段,靜態方法)