Python3.7学习笔记19-面向对象
在我们日常开发中。程序设计方式大体分为2种。一种是面向过程,一种是面向对象。
一:面向对象
这种程序设计方式强调的是对象。类实例化对象之后。引用对象各种方法、属性的编程模式达到预期目的的过程。
1、下面我们用一个计算器的类来解释几个重要的概念
class Calculator(): # 如果不继承类。类名后面加不加括号都可以。默认加载object类
"""
计算器类
"""
# 类变量
a = '+'
b = '-'
c = '*'
d = '/'
__siyou = '私有变量' # 私有变量前面有2个下划线。只能类内部引用。
# 实例化对象的时候会执行初始化函数
def __init__(self, first_number, second_number):
assert int(first_number), '输入的数必须为整数'
assert int(second_number), '输入的数必须为整数'
self.first_number = first_number # 实例变量
self.second_number = second_number # 实例变量
# 成员函数
def variable(self):
"""
演示局部变量和私有变量
:return:
"""
text = '局部变量'
return (text + Calculator.__siyou)
def addition(self):
"""
加法函数
:return:
"""
print('调用了' + Calculator.a + '运算') # 类名引用类变量
return (self.first_number + self.second_number)
def hair_reduction(self):
"""
减法函数
:return:
"""
print('调用了' + self.b + '运算') # 实例化引用类变量
return (self.first_number + self.second_number)
calculator_object = Calculator(1, 2) # calculator_object 类的实例化对象
print(calculator_object.addition()) # 引用对象加法运算
print(calculator_object.variable()) # 引用对象函数
print(calculator_object.a) # 访问对象类变量
# print(calculator_object.__siyou) # 访问对象私有变量是会报错的
calculator_object.test='新增类的一个属性'
calculator_object.b = '修改类的一个属性值'
print(calculator_object.test,calculator_object.b) # 访问对象的2个静态属性
print(calculator_object.hair_reduction()) # 引用对象的减法函数
2、类中的函数,主要分为以下四种。
# -*- coding: utf-8 -*-
# @Time : 2020/4/14 22:08
# @Author : linglong
# @File : demo.py
class Calculator():
"""
计算器类
"""
# 类变量
a = '+'
b = '-'
c = '*'
d = '/'
# 实例化对象的时候会执行初始化函数
def __init__(self, first_number, second_number):
assert int(first_number), '输入的数必须为整数'
assert int(second_number), '输入的数必须为整数'
self.first_number = first_number # 实例变量
self.second_number = second_number # 实例变量
# 类函数
@classmethod
def update_obj_variable(cls, update_first_number, update_second_number):
"""
构造不一样__init__函数初始化的实例变量值
:return:
"""
return cls(first_number=update_first_number, second_number=update_second_number)
# 静态函数
@staticmethod
def return_print(operation):
"""
返回使用运算方式
:param operation:
:return:
"""
return ('调用了' + operation + '运算')
# 成员函数
def addition(self):
"""
加法函数
:return:
"""
print(self.return_print(Calculator.a)) # 引用静态函数
return (self.first_number + self.second_number)
# 成员函数
def hair_reduction(self):
"""
减法函数
:return:
"""
print(self.return_print(Calculator.b)) # 引用静态函数
return (self.first_number + self.second_number)
calculator_object = Calculator.update_obj_variable(1, 2) # 引用类函数不需要初始化对象。
print(calculator_object.addition()) # 引用对象加法运算
calculator_object.first_number = 3 # 修改实例变量的值
calculator_object.second_number = 4 # 修改实例变量的值
print(calculator_object.hair_reduction()) # 引用对象加法运算
3、类的专有方法
除了第一个比较常用之外。其他的感觉没咋用过。
class Mylist:
__mylist = []
def __init__(self, *args):
self.__mylist = []
for arg in args:
self.__mylist.append(arg)
def __str__(self):
return '打印实例化对象的时候返回的就是这个'
def __add__(self, n):
"""
对象和一个数相加。就会执行该方法。其他同理。
:param n:
:return:
"""
for i in range(0, len(self.__mylist)):
self.__mylist[i] = self.__mylist[i] + n
def __sub__(self, n):
for i in range(0, len(self.__mylist)):
self.__mylist[i] = self.__mylist[i] - n
def __mul__(self, n):
for i in range(0, len(self.__mylist)):
self.__mylist[i] = self.__mylist[i] * n
def __div__(self, n):
for i in range(0, len(self.__mylist)):
self.__mylist[i] = self.__mylist[i] / n
def __mod__(self, n):
for i in range(0, len(self.__mylist)):
self.__mylist[i] = self.__mylist[i] % n
def __pow__(self, n):
for i in range(0, len(self.__mylist)):
self.__mylist[i] = self.__mylist[i] ** n
def __len__(self):
return len(self.__mylist)
def show(self):
print(self.__mylist)
l = Mylist(1, 2, 3, 4, 5)
print(l)
l.show()
l + 5
l.show()
l - 3
l.show()
l * 6
l.show()
l % 4
l.show()
l ** 3
l.show()
print(len(l))
b = Mylist(2, 3, 4, 5, 6, 7, 8, 9)
print(len(b))
b.show()
b - 5
b.show()
l.show()
4、类的继承
# -*- coding: utf-8 -*-
# @Time : 2020-04-20 22:11
# @Author : zhonglinglong
# @File : demo.py
"""
"""
# 父类
class Calculator():
"""
计算器类
"""
# 类变量
a = '+'
b = '-'
c = '*'
d = '/'
# 实例化对象的时候会执行初始化函数
def __init__(self, first_number, second_number):
assert int(first_number), '输入的数必须为整数'
assert int(second_number), '输入的数必须为整数'
self.first_number = first_number # 实例变量
self.second_number = second_number # 实例变量
# 成员函数
def addition(self):
"""
加法函数
:return:
"""
print(self.return_print(Calculator.a)) # 引用静态函数
return (self.first_number + self.second_number)
# 成员函数
def hair_reduction(self):
"""
减法函数
:return:
"""
print(self.return_print(Calculator.b)) # 引用静态函数
return (self.first_number + self.second_number)
# 静态函数
@staticmethod
def return_print(operation):
"""
返回使用运算方式
:param operation:
:return:
"""
return ('调用了' + operation + '运算')
# 子类
class SubclassCalculator(Calculator):
"""
子类继承计算机类
"""
def __init__(self, first_number, second_number):
super().__init__(first_number, second_number) # 初始化父类的构造函数
def multiplication(self):
"""
乘法
:return:
"""
print(self.return_print(self.c)) # 引用静态函数
return (self.first_number * self.second_number)
# 子类重写父类方法
def hair_reduction(self):
"""
减法函数
:return:
"""
print('调用的是子类方法')
print(self.return_print(Calculator.b)) # 引用静态函数
return (self.first_number + self.second_number)
demo_object = SubclassCalculator(3, 2)
print(demo_object.multiplication())
print(demo_object.hair_reduction())
class A():
def __init__(self):
print('A')
class B(A):
def __init__(self):
print('B')
super().__init__()
class C(A):
def __init__(self):
print('C')
super().__init__()
class D(C):
def __init__(self):
print('D')
super().__init__()
test = D()
class AA():
def __init__(self):
print('AA')
def get(self):
print('A1')
class BB():
def __init__(self):
print('BB')
def get(self):
print('B1')
class DD():
def __init__(self):
print('DD')
class CC(AA, BB, DD):
def __init__(self):
print('CC')
super().__init__()
self.get()
t = CC()
from abc import ABCMeta, abstractmethod
class Calculator(metaclass=ABCMeta):
"""
抽象类
"""
def __init__(self):
print('抽象类')
# 加了该装饰器之后。该抽象类不能实例化。且继承的子类必须实现这个方法。
@abstractmethod
def addition(self):
"""
加法函数
:return:
"""
print('加法')
pass
def hair_reduction(self):
"""
减法函数
:return:
"""
pass
class A(Calculator):
def __init__(self):
print('继承抽象类')
super().__init__()
def addition(self):
print('必须重写加了装饰器的抽象类的函数,否则实例化对象的时候一定报错')
a = A()
a.addition()
二:面向过程
面向过程:侧重的是过程。编程思想是准备好需要使用的函数和数据。然后按需求把函数和数字按照一定的顺序组合起来。
计算器的例子用面向过程实现的思想如下:
# 面向过程编程
def addition(first_number, second_number):
assert int(first_number), '输入的数必须为整数'
assert int(second_number), '输入的数必须为整数'
print('调用了加法运算')
return (int(first_number) + int(second_number))
def hair_reduction(first_number, second_number):
assert int(first_number), '输入的数必须为整数'
assert int(second_number), '输入的数必须为整数'
print('调用了减法运算')
return (int(first_number) - int(second_number))
def multiplication(first_number, second_number):
assert int(first_number), '输入的数必须为整数'
assert int(second_number), '输入的数必须为整数'
print('调用了乘法运算')
return (int(first_number) * int(second_number))
def division(first_number, second_number):
assert int(first_number), '输入的数必须为整数'
assert int(second_number), '输入的数必须为整数'
print('调用了除法运算')
return (int(first_number) / int(second_number))
a = 3
b = 4
print(addition(a, b))
print(hair_reduction(a, b))
print(multiplication(a, b))
print(division(a, b))
综述,面向过程和面向对象都能够实现同一功能。我们需要根据不同的场景来选择程序设计模式。一般来说。我们写个很小的工具或者实现某个单一固定的功能。因为不用担心代码复用维护的问题。还是推荐使用面向过程来实现。而当我们写项目级别的代码。尤其是协同开发。我们应该尽可能的通过分析需求。找出相似点。用一个或者几个类的形式实现。能够极大提高代码的复用率和代码维护效率。