Python面向對象(公有與私有)


面向對象的私有與公有

對於每一個類的成員而言都有兩種形式:

公有成員,在任何地方都能訪問

私有成員,只有在類的內部才能方法

私有成員和公有成員的訪問限制不同:

靜態字段(靜態變量)

公有靜態字段:類可以訪問;類內部可以訪問;派生類中可以訪問

私有靜態字段:僅類內部可以訪問;

公有靜態字段

class A:

    name = "公有靜態字段"

    def func(self):

        print(A.name)

class B(A):

    def show(self):

        print(A.name)

print(A.name)    #類訪問

obj = A() 

obj.func()       #類內部可訪問

obj_son = B()

obj_son.show()   #派生類中可訪問

私有靜態字段

class A:

    __name = "私有靜態字段"

    def func(self):

        print(A.__name)

class B(A):

    def show(self):

        print(A.__name)

obj = A()

obj_2 = B()

#print(obj.__name)   #在外部訪問報錯

obj.func()  #類內部可以訪問

obj_2.show()  #不可在派生類中訪問

AttributeError: type object 'A' has no attribute '_B__name'

普通字段(對象屬性)

公有普通字段:對象可以訪問;類內部可以訪問;派生類中可以訪問

私有普通字段:僅類內部可以訪問;

公有普通字段

class A:

    def __init__(self):

        self.foo = "公有字段"

    def func(self):

        print(self.foo)

class B(A):

    def show(self):

        print(self.foo)

obj = A()

print(obj.foo)

obj.func()

obj_2 = B()

obj_2.show()

私有普通字段

class A:

    def __init__(self):

        self.__foo = "私有字段"

    def func(self):

        print(self.__foo)

class B(A):

    def show(self):

        print(self.__foo)

obj = A()

# print(obj.__foo)   #外部訪問報錯

obj.func()   #類內部訪問

# obj_2 = B()

# obj_2.show()  #派生類中訪問報錯

方法

公有方法:對象可以訪問;類內部可以訪問;派生類中可以訪問

私有方法:僅類內部可以訪問;

公有方法

class A:

    def __init__(self):

        pass

    def add(self):

        print('A')

class B(A):

    def show(self):

        print("B")

    def func(self):

        self.show()

obj = B()

obj.show()

obj.func()

obj.add()

私有方法

class A:

    def __init__(self):

        pass

    def __add(self):

        print('A')

class B(A):

    def __show(self):

        print("B")

    def func(self):

        self.__show()

obj = B()

obj.__show()   #不能訪問

obj.func()    #能訪問

obj.__add()  #不能訪問

總結:

對於這些私有成員來說,他們只能在類的內部使用,不能再類的外部以及派生類中使用.

非要訪問私有成員的話,可以通過 對象._類__屬性名,但是絕對不允許!!!

為什么可以通過._類__私有成員名訪問呢?因為類在創建時,如果遇到了私有成員(包括私有靜態字段,私有普通字段,私有方法)它會將其保存在內存時自動在前面加上_類名.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM