1. 程式人生 > >python3_類的封裝概念理解

python3_類的封裝概念理解

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2018/5/19 0:23
# @Author  : chenlin
# @File    : 封裝之如何實現屬性的隱藏.py

# 如何實現隱藏

"""
類的變數隱藏其實只是變了一個名字而已,並不是真的無法訪問
不會執行程式碼,但會檢查語法,同時將隱藏變數名修改
"""
# class A:
#     __x = 1  # _A__x=1
#
#     def __init__(self, name):
#         self.__name = name  # self._A__name=name ,不能真正的限制訪問
# # def __foo(self): # def _A__foo(self): # print('run foo') # # def bar(self): # self.__foo() # 在內部訪問時,定義階段就改變了名稱self._A__foo() # print('from bar') #### 檢視類裡的變數方法 # print(A.__dict__) # 打印出類變數的名稱 # print(A.__x) # 報錯,不存在,不存在此變數名 # print(A.__foo) # 報錯,不存在,不存在此變數名
# 只有下面的才是正確的 # a = A('egon') # a._A__foo() # print(a._A__x) # print(a.__name) # 報錯,應該是a.__dict__['_A__name'] # print(a.__dict__) # a.bar() # 繼承時,不存在覆蓋隱藏變數這個方法 """ 要是真的將func修改為 class Foo: def __func(self): # _Foo__func print('from foo') class Bar(Foo): def __func(self): # _Bar__func print('from bar') 此時在定義階段。他們都是不一樣的變數名,所以不存在覆蓋這個說法 """
#### 舉例驗證 # class B: # __x=1 # # def __init__(self,name): # self.__name=name #self._B__name=name # 驗證問題一:(在類外部訪問,改變了變數名) # print(B._B__x) # 驗證問題二:(變形只在定義是起作用,只有一次,定義後就不再重新命名了) # B.__y=2 # print(B.__dict__) # b=B('egon') # print(b.__dict__) # # b.__age=18 # print(b.__dict__) # print(b.__age) # 驗證問題三:(在繼承中,父類如果不想讓子類覆蓋自己的方法,可以將方法定義為私有的,因為名字變了) # class A: # def foo(self): # print('A.foo') # # def bar(self): # print('A.bar') # self.foo() #b.foo() # # class B(A): # def foo(self): # print('B.foo') # # b=B() # b.bar() # class A: # def __foo(self): #_A__foo # print('A.foo') # # def bar(self): # print('A.bar') # self.__foo() #self._A__foo() # # class B(A): # def __foo(self): #_B__foo # print('B.foo') # # b=B() # b.bar() #### 小結 ''' 封裝的特點 這種變形的特點: 1、在類外部無法直接obj.__AttrName 2、在類內部是可以直接使用:obj.__AttrName 3、子類無法覆蓋父類__開頭的屬性(因為隱藏的屬性名被添加了類名_Class__AttrName) '''