python的封装

1.什么是封闭

在日常中封装指的是将我们的物品包裹起来,不让看到其内部,具有保护的功能。
在程序设计中,封装(Encapsulation)是将类中的某些部分(某些属性或者方法)隐藏起来,
对象不能直接使用隐藏起来的属性或者方法,具有保护功能。

class Person:
    __name = 'lee'
	def __set(self):
		print('...')
#会报错,因为__name是私有属性,只能在类的内部调用

总结:隐藏对象的属性和方法实现细节,仅对外提供公共访问方式。
封装格式: __属性或者方法名称。(我们也叫做私有属性或者方法)
封装的目的:保护隐私。

2、私有属性

格式:__属性名=值
在类的外部不能使用(对象不能调用私有属性)

1.在Person类的外部创建age属性。

# 格式:__属性名=值
# 在类的外部不能使用(对象不能调用私有属性)
class Person:
    def eat(self):
        print('吃了')


lee = Person()
lee.age = 21
print(lee.age)

2.使用私有属性来限制修改age。

class Person:

    def set_age(self, new_age):
        self.__age = new_age

    def get_age(self):
        print('这是你的年龄:%s' % self.__age)


lee = Person()
lee.set_age(10)
lee.get_age()

输出为:

这是你的年龄:10

如上代码所示,如果将age设置为私有属性即:__age,则用lee.age或者lee.__age都不能对__age的值进行修改。必须在类内,才能进行修改。

3.私有方法

私有方法:在方法前添加__ 例如 __send_message()
私有方法的作用:就是在开发的过程中保护核心代码。
在类的外部不能使用(对象不能调用私有方法)

class A:
    def test1(self):
        print('test1')

    def __test2(self):
        print('test2')

    def test3(self):
        print('test3')
        self.__test2()


a = A()
a.test1()
a.test3()

输出为:

test1
test3
test2

如上代码所示,需要在test3中调用__test2,而如果直接在外面a.__test2的话,则会报错,此时__test2方法为私有方法。

4.私有化封装后的限制

类中 可以访问
类外/对象外 不可以访问
子类/子类对象 不可以访问

class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age


lee = Person('lee', 21)
lee.__age=12
print(lee.__dict__)

输出为:

{'name': 'lee', '_Person__age': 21, '__age': 12}

如上代码所示,类的内部使用私有属性,python内部会自动进行转换成_类__属性名。
而在外部,对象.__XX添加私有属性名,python内部并不会自动转换成_类__属性名,因此不能覆盖私有属性!

注意事项:
1.在python中实现的封装操作,不是通过权限限制而是通过改名(name mangling 改名策略)实现的,名字变了找不到而已。
2.可以使用 __dict__可以查看属性(包括私有属性)的值
在类的内部使用私有属性,python内部会自动进行转换成 _类名__属性名。
在类的外部不能给对象添加私有属性因为不能转换成_类名__属性名类型。
3.可以通过 对象名._类名__方法或类名._类名__方法名访问到(但禁止这么干)
可以使用 _类名__私有属性名来获取值。但是一般情况下不要使用,了解即可。

使用__dict__查看对象属性,并且调用私有属性和修改私有属性的值。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.__age = age


lee = Person('lee', 21)
print(lee._Person__age)
lee._Person__age = 12
print(lee.__dict__)

输出如下:

21
{'name': 'lee', '_Person__age': 12}

猜你喜欢

转载自blog.csdn.net/weixin_44251004/article/details/86498590