九、Python之面向对象--封装

数据角度讲

    定义:

将一些基本数据类型复合成一个自定义类型。

    优势:

            将数据与对数据的操作相关联。

            代码可读性更高(类是对象的模板)。

 

行为角度讲

    定义:

类外提供必要的功能,隐藏实现的细节。

    优势:

             简化编程,使用者不必了解具体的实现细节,只需要调用对外提供的功能。

    私有成员:

             作用:无需向类外提供的成员,可以通过私有化进行屏蔽。

             做法:命名使用双下划线开头。

             本质:障眼法,实际也可以访问。

            私有成员的名称被修改为:_类名__成员名,可以通过_dict_属性或dir函数查看。

    属性@property:

             公开的实例变量,缺少逻辑验证。私有的实例变量与两个公开的方法相结合,又使调用者的操作略显复杂。而属性可以将两个方法的使用方式像操作变量一样方便。

             定义:

@property
def name(self):
return self.__name

@name.setter
def name(self, value):
self.__name= value

             调用:

对象.属性名 = 数据 (赋值)

变量 = 对象.属性名 (取值)

             说明:

    通常两个公开的属性,保护一个私有的变量。

    @property 负责读取,@属性名.setter 负责写入

    只写:属性名= property(None(读), 写入方法名)

设计角度讲:

    定义:

        (1)分而治之

            -- 将一个大的需求分解成为许多类,每个类处理一个独立的功能

            -- 拆分好处:便于分工,便于服用,可扩展性强。

        (2)封装变化

            -- 将变化的地方独立封装,避免影响其他类

        (3)高内聚

            -- 类中各个方法都在完成一项任务,单一职责类

        (4)低耦合

            -- 类与类之间的关联性与依赖度要低(每个类独立)

            -- 将一个大的需求分解成为许多类,每个类处理一个

    作用:

          便于分工,便于复用,可扩展性强

示例:

class MyClass:
 
    y = 0
 
    @classmethod
    def fun1(cls):
        pass
 
    def fun2(self):
        print(self.x)
 
    def __init__(self,x):
        self.x = x
        # 私有变量
        self.__y = 100
        self.__z = 0
 
    # 属性拦截了对变量的读写操作
    @property
    def x(self):
        if self.__x < 0:
            return 0
        return  self.__x
 
    @x.setter
    def x(self,value):
        self.__x = value
 
    # 只有 @property 的属性,称之为只读属性。
    @property
    def y(self):
        return  self.__y
 
    # @z.setter
    # def z(self, value):
    #     self.__z = value
 
    # 定义只写属性
    #1. 定义私有的写入方法
    def __set_z(self, value):
        self.__z = value
 
    # z = property(读取方法,写入方法)
    #2. 定义只写属性
    z = property(None,__set_z)
 
 
# 建议使用类名 访问类成员
print(MyClass.y)
MyClass.fun1()
 
 
# 其实语法上可以通过对象地址访问类成员
c01 = MyClass(1)
print(c01.y)
c01.fun1()
# 实例方法 建议通过对象地址调用
c01.fun2()
# 实际也可以通过类名调用,但仍然需要传递对象地址
MyClass.fun2(c01)
 
c01.x = -1
print(c01.x)
 
# 只读属性
print(c01.y)
# c01.y = 200
 
c01.z = 200
# c01.set_z(200)
# print(c01.z)
print(c01._MyClass__z)
发布了39 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/chiaotien/article/details/104359857