偷学Python第十七天:面向对象(二)类的封装

人生苦短我用Python

偷学Python第十七天:面向对象(二)类的封装

目标:可以用Python做一些简单的数据分析。
在这里插入图片描述

坚持完成自己的目标!勿忘初心~

今日学习目标

Python类的封装

今日学习内容

封装的理解

封装(Encapsulation):属性和方法的抽象

  • 属性的抽象:对类的属性(变量)进行定义、隔离和保护

    分为私有属性和公开属性

    • 私有属性:只能在类内部访问
    • 公开属性:可以通过类、对象名访问

    可以选择公开或隐藏属性,隐藏属性的内在机理

  • 方法的抽象:对类的方法(函数)进行定义、隔离和保护

    分为私有方法和公开方法

    • 私有方法:只能在类内部访问
    • 公开方法:可以通过类、对象名访问

    可以选择公开或隐藏方法,隐藏方法的内部逻辑

  • 目标是形成一个对外可操作属性和方法的接口

封装就是让数据和代码称为类的过程,表达为:类-——属性——方法

私有类属性、公开类属性、私有实例属性和公开实例属性

公开类属性

公开类属性就是类属性,语法结构

class ClassName:
    <类属性名> = <类属性初值>
    def __init__(self,[参数1][参数2]...[参数n]):
        self.<实例属性名> = <实例属性初值>
    ...

私有类属性

私有类属性只能当前类进行访问,子类不能访问。语法结构

class ClassName:
    <__私有类属性名> = <私有类属性初值>
    def __init__(self,[参数1][参数2]...[参数n]):
        self.<实例属性名> = <实例属性初值>
    ...

私有类属性定义的时候属性名字前面需要两个下划线(__).

只能在类的内部被方法所访问

不能通过<类名>.<类属性>或者<对象名>.<类属性>的方式访问

有效保证了属性维护的可控性

示例代码

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/15
"""


class TestClass:
    __number = 0

    def __init__(self, num_value):
        for i in range(num_value + 1):
            TestClass.__number += i

    @classmethod  # 类方法
    def sum_number(cls):
        return TestClass.__number


value1 = TestClass(100)
print(TestClass.sum_number())  # 5050
# print(value1.__number)  # AttributeError: 'TestClass' object has no attribute '__number'

在类外卖访问.__number就会报出AttributeError异常

公开实例属性

公开实例属性就等于示例属性,语法结构

class <类名>:
    <类属性名> = <类方法值>
    def __init__(self, <参数列表>):
        self.<实例属性名> = <实例属性值>
    ...

私有实例属性

私有实例属性只能在当前类内部使用,子类也不能使用。语法结构

class <类名>:
    <类属性名> = <类方法值>
    def __init__(self, <参数列表>):
        self.<__私有实例属性名> = <实例属性值>
    ...

私有实例属性定义的时候属性名字前面需要两个下划线(__).

只能在类的内部被方法所访问

不能通过<类名>.<类属性>或者<对象名>.<类属性>的方式访问

有效保证了属性维护的可控性

示例代码

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/15
"""


class TestClass:

    def __init__(self, num_value):
        self.__number = 0
        for i in range(num_value + 1):
            self.__number += i

    def sum_number(self):
        return self.__number


value1 = TestClass(100)
print(value1.sum_number())  # 5050
# print(value1.__number)  # AttributeError: 'TestClass' object has no attribute '__number'

私有属性不一定真的私有

私有属性的双下划线只是一种转换约定,转换后,类内原有名字发生了变化,这是一种形式上的私有

示例代码

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/15
"""


class TestClass:

    def __init__(self, num_value):
        self.__number = 0
        for i in range(num_value + 1):
            self.__number += i

    def sum_number(self):
        return self.__number


value1 = TestClass(100)
print(value1.sum_number())  # 5050
print(value1._TestClass__number)  # 5050
# 可以通过 对象名._类名__属性 的方式来访问

可以通过对象名._类名__属性的方式来访问。

私有方法和公开方法

定义方法是在类内部定义并使用的方法。语法结构

class <类名>:
    def <__私有方法名>(self, <参数列表>):
        ...

私有方法定义的时候属性名字前面需要两个下划线(__).

各类方法都可以通过增加双下换线的方式将方法变为私有方法

私有方法在形式上保护了Python类内部使用的函数逻辑

私有属性与公开是程序员逻辑,不是安全逻辑,重视约定

类的保留属性

Python解释器预留的类属性,以双下换线开头或者结尾。

  • 保留属性也叫特殊属性
  • 以双下划线开头和结尾
  • 作用是为理解Python类提供了统一的属性接口
  • 属性值具有特殊的含义,类定义后直接使用

仅用<类名>访问的保留属性

保留属性 描述
__name__ 类的名词
__qualname__ .分隔从模板全局命名空间开始的类名称
__bases__ 类所继承的基类名称

示例代码

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/15
"""


class TestClass:

    def __init__(self, num_value):
        self.number = 0
        for i in range(num_value + 1):
            self.number += i

    class TestClass1:
        def __init__(self):
            print("这是嵌套的类")

    def sum_number(self):
        return self.number


value1 = TestClass(100)
print(TestClass.__name__, TestClass.__qualname__, TestClass.__base__)
# TestClass TestClass <class 'object'>
print(TestClass.TestClass1.__name__, TestClass.TestClass1.__qualname__, TestClass.TestClass1.__base__)
# TestClass1 TestClass.TestClass1 <class 'object'>

可以用类或者对象名访问的保留属性

保留属性 描述
<类>.__dict__ 包含类成员信息的字典,key是属性和方法名称,value是地址
<对象>.__dict__ 包含对象实例属性信息的字典,key是属性名称,value是值
__class__ 对象所对应的类信息,即type信息
__doc__ 类描述,写在类定义下的首行字符串,不能继承
__module__ 类所在的模块名称

示例代码

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/15
"""


class TestClass:

    def __init__(self, num_value):
        self.number = 0
        for i in range(num_value + 1):
            self.number += i

    def sum_number(self):
        return self.number


value1 = TestClass(100)
print(TestClass.__dict__)  # {'__module__': '__main__', '__init__': <function TestClass.__init__ at 0x0000019C2A389620>, 'sum_number': <function TestClass.sum_number at 0x0000019C2A389598>, '__dict__': <attribute '__dict__' of 'TestClass' objects>, '__weakref__': <attribute '__weakref__' of 'TestClass' objects>, '__doc__': None}
print(value1.__dict__)  # {'number': 5050}
print(TestClass.__class__)  # <class 'type'>
print(value1.__class__)  # <class '__main__.TestClass'>
print(TestClass.__module__)  # __main__
print(value1.__module__)  # __main__

类的保留方法

保留方法是Python解释器预留的方法,以双下划线开头和结尾

  • 保留方法也叫特殊方法
  • 以双下划线开头和结尾
  • 作用是为理解Python类提供了统一的方法接口
  • 方法逻辑:具有特定的含义,一般与操作符关联,类定义需要重载

Python保留的基础方法

保留方法 对应操作 描述
obj.__init__() obj = ClassName() 初始化实例对象的函数逻辑
obj.__del__() del obj 删除实例对象的函数逻辑
obj.__repr__() repr(obj) 定义对象可打印字符串的函数逻辑
obj.__str__() str(obj) 定义对象字符串转换操作的函数逻辑
obj.__bytes__() bytes(obj) 定义对象字节串转换操作的函数逻辑
obj.__format__() obj.format 定义对象格式化输出的函数逻辑
obj.__bool__() bool(obj) 定义对象布尔运算的函数逻辑
obj.__len__() len(obj) 定义对象长度操作的函数逻辑
obj.__reversed__() obj.reversed() 定义对象逆序的函数逻辑
obj.__abs__() abs(obj) 定义对选哪个绝对值操作的函数逻辑
obj.__int__() int(obj) 定义对象整数转换的逻辑函数

Python保留的比较方法

保留方法 对应操作
obj.__lt__() obj1 < obj2
obj.__le__() obj1 <= obj2
obj.__eq__() obj1 == obj2
obj.__be__() obj1 != obj2
obj.__gt__() obj1 > obj2
obj.__ge__() obj1 >= obj2

Python中超过了100个保留方法(好像给自己挖了个坑)

保留方法对应对象、对象间、对象方法的各种操作

今日学习总结

Python类的封装的概念,定义私有属性或者方法使用双下换线开头(注意:Python中并没有实现真正的私有),保留属性和方式是双下划线开始和结束的

明日学习计划

Python类的封装

甜甜有话说

我真的服了,我家断网两天了,联系装宽带的一直拖,热点伤不起啊,我已经限速了╥﹏╥

座右铭:不要在该奋斗的年纪选择安逸!!

加油

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼

猜你喜欢

转载自blog.csdn.net/weixin_46163658/article/details/106151985