1. 程式人生 > >14.11類的成員修飾符

14.11類的成員修飾符

Python 成員修飾符 訪問權限

成員修飾符

類的所有成員分為:字段,方法
  公有成員,在任何地方都能訪問
  私有成員,只有在類的內部才能訪問
私有成員和公有成員的定義不同:私有成員命名時,前兩個字符是下劃線。(特殊成員除外,例如:initcall等)
私有成員和公有成員的訪問限制不同:
靜態字段:
公有靜態字段:類可以訪問,類內部可以訪問;派生類中可以訪問
私有靜態字段:僅類內部可以訪問
普通字段:
  公有普通字段:對象可以訪問;類內部可以訪問;派生類中可以訪問
  私有普通字段:僅類內部可以訪問
方法、屬性的訪問與上述方式相似,即,私有成員只能在類內部使用。
PS:私有成員若非要訪問的話,可以通過 對象._類__屬性名 來訪問。

私有普通字段

# -*-coding:utf-8 -*-
__author__ = ‘xiaojiaxin‘
__file_name__ = ‘成員修飾符‘

class foo:
    def __init__(self,name,age,__age):
        self.name=name
        self.age=age
        self._age=age   #私有,外部無法直接訪問

    def show(self):
        return self._age  #間接訪問私有字段

obj=foo("jiaxin",10,1)
print(obj.name)
print(obj.age)
print(obj._age)
print(obj.show())

私有靜態字段

class Hoo:
    __v="123"

    def __init__(self):
        pass

    def show(self):
        return Hoo.__v

    @staticmethod
    def staticmd():
        return Hoo.__v

#print(Hoo.__v)   #靜態私有字段不能被外部訪問

obj2=Hoo()
print(obj2.show()) #靜態私有字段可以間接被外部訪問
# 123

obi3=Hoo.staticmd()
print(obi3)
# 123

私有普通方法

class qoo:

    def __f1(self):
        return "f1"

    def f2(self):
        r=self.__f1()
        return r
obj4=qoo()
print(obj4.f2())
# f1

派生類不能繼承基類的私有字段

class F:

    def __init__(self):
        self.ge="dad1"
        self.__gene="dad"

class S(F):

    def __init__(self,name):
        self.name="son"
        self.__age=10
        super(S,self).__init__()

    def show(self):
        print(self.name)
        print(self.__age)
        print(self.ge)
        #print(self.__gene)   #無法訪問父類的私有字段,只能通過繼承公有才行

s=S("jiaxin")
s.show()

14.11類的成員修飾符