python3_類的封裝概念理解
阿新 • • 發佈:2019-01-24
#!/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)
'''