一、封装
1、广义的封装:实例化一个对象,给对象空间封装一些属性
class A:
def __init(self,name):
selef.name = name#对象封装属性
2、狭义的封装:私有制。 私有成员:私有静态字段、私有动态方法、私有对象
私有静态字段(见下方代码):
1、实例化对象不能访问私有静态字段
2、类名不能访问私有静态字段
结论:对于私有静态字段,只能在本类中内部访问,派生类不可访问
#类外访问私有静态字段
class A:
name ="张三"#对象属性,非私有
__age = 10#私有静态字段
def func(self):
print("任意输出")
a = A()
print(a.name)#类外访问:对象访问非静态字段,可正常输出“张三”
print(A.name)#类外访问:类访问非静态字段,可正常输出“张三”
print(a.__age)#类外访问:对象访问私有静态字段,报错 type object 'A' has no attribute '__age'
print(A.__age)#类外访问:类访问私有静态字段,报错 type object 'A' has no attribute '__age'
#类内访问私有静态字段
class A:
name ="张三"#对象属性,非私有
__age = 10#私有静态字段
def func(self):
print(self.__age)#本类内访问私有静态变量
print(A.__age) #本类内访问私有静态变量
print("任意输出")
a = A()
a.func()
#结果
#19
# 19
# 随便输出
#派生类不可访问私有静态字段
class A:
name ="张三"#对象属性,非私有
__age = 10#私有静态字段
def func(self):
print(self.__age)#本类内访问私有静态变量
print(A.__age) #本类内访问私有静态变量
print("任意输出")
class B(A):
def func1(self):
print(self.__age)
print(B.__age)
b = B()
b.func1()
#结果
#'B' object has no attribute '_B__age'
私有方法(见下方代码):
1、类外不能访问私有方法
2、类的内部可以访问
结论:对于私有方法,只能在本类中内部访问,派生类不可访问
class A:
name ="张三"
__age = 19
def __func(self):#基类中定义一个私有方法
print("私有方法")
def f1(self):
self.__func()#类内访问私有方法
class B(A):
def func1(self):
self.__func()
b = B()
a = A()
a.__func()#类外不可访问私有方法 'A' object has no attribute '__func'
a.f1()#输出“私有方法”--本类内可以访问私有方法
b.func1()#派生类不可访问基类的私有方法 'B' object has no attribute '_B__func'