偷学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类提供了统一的属性接口
- 属性值具有特殊的含义,类定义后直接使用
仅用
<类名>
访问的保留属性
保留属性 | 描述 |
---|---|
| 类的名词 |
| 以 分隔从模板全局命名空间开始的类名称 |
| 类所继承的基类名称 |
示例代码
"""
-*- 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'>
可以用类或者对象名访问的保留属性
保留属性 | 描述 |
---|---|
| 包含类成员信息的字典,key是属性和方法名称,value是地址 |
| 包含对象实例属性信息的字典,key是属性名称,value是值 |
| 对象所对应的类信息,即type信息 |
| 类描述,写在类定义下的首行字符串,不能继承 |
| 类所在的模块名称 |
示例代码
"""
-*- 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保留的基础方法
保留方法 | 对应操作 | 描述 |
---|---|---|
| | 初始化实例对象的函数逻辑 |
| | 删除实例对象的函数逻辑 |
| | 定义对象可打印字符串的函数逻辑 |
| | 定义对象字符串转换操作的函数逻辑 |
| | 定义对象字节串转换操作的函数逻辑 |
| | 定义对象格式化输出的函数逻辑 |
| | 定义对象布尔运算的函数逻辑 |
| | 定义对象长度操作的函数逻辑 |
| | 定义对象逆序的函数逻辑 |
| | 定义对选哪个绝对值操作的函数逻辑 |
| | 定义对象整数转换的逻辑函数 |
Python保留的比较方法
保留方法 | 对应操作 |
---|---|
| |
| |
| |
| |
| |
| |
Python中超过了100个保留方法(好像给自己挖了个坑)
保留方法对应对象、对象间、对象方法的各种操作
今日学习总结
Python类的封装的概念,定义私有属性或者方法使用双下换线开头(注意:Python中并没有实现真正的私有),保留属性和方式是双下划线开始和结束的