python 公有屬性和私有屬性

  • 2020 年 1 月 13 日
  • 筆記

十三、python 公有屬性和私有屬性

屬性

方法:

class Chinese(Person):

nation = 'China'

def __init__(self,name):

self.__name = name

def msg(self):

print self.name

屬性:

-類屬性

-實例屬性

屬性的可見性:

-公有屬性

-私有屬性

class Chinese(Person):

nation = 'China'  #類屬性

def __init__(self,id,name):

self.id = id #公有屬性

self.__name = name #實例屬性,私有屬性

def msg(self):

print self.name

私有屬性:

python並沒有真正的私有屬性

用__定義的屬性,只是被改名換姓而已

用_定義的屬性,意義在於喚起用戶的注意,看成私有屬性

——————————————————————

class Chinese(object):

    nation = 'Chain'

    def __init__(self, id, name):

        self._id = id

        self.__name = name

    def sayHi(self, msg):

        print self.__name,msg

 #定義實例

aidon = Chinese(1,'aidong')

bajie = Chinese(2,'bajie')

#通過類看類屬性

Chinese.nation

#通過實例看類屬性

aidon.nation

#通過類修改類屬性

Chinese.nation=u'中國'

#再次查看

Chinese.nation

aidon.nation

bajie.nation

#通過實例修改類屬性(只對該實例管用):盡量不用實例對象修改類屬性

aidon.nation='Chain'

#查看實例字典

aidon.__dict__

#修改實例屬性(_)的值(_id感覺是點沒有被保護,底層也沒有改名換姓)

aidon._id

aidon._id = 100  #是否能修改該實例對象的私有屬性值(可以)

aidon._id

#修改實例屬性(__)的值(__name感覺是點被保護,底層其實是改名換姓)

bajie.__name

bajie.__name = "tangzeng" #該方式修改是不對的 (相當於是新增咯)

bajie._Chinese__name = 'wukong'  #這樣才可以,我們定義實例屬性是__name,但是壓根被python改咯個名字,規律是:_classname__propertyname

#調用方法:

aidon.sayHi("hello aidon")

————————————————————

怎麼真正來操作(讀寫刪除)屬性呢?要直接訪問屬性就違背面向對象封裝原則