python - 类和对象

一.类

类名用大写字母开头

属性是类中的变量,方法是类中的函数

类、class关键字:

>>> class Turtle:
...     color = 'green'
...     weight = 10
...     legs = 4
...     shell = True
...     mount = '大嘴'
...     def climb(self):
...             print("我正在努力的向前爬")
...     def run(self):
...             print("我正在飞快的向前怕")
...     def bite(self):
...             print("咬死你咬死你")
...     def eat(self):
...             print("有的吃真满足")
...     def sleep(self):
...             print("困了困了")
...
>>> t1 = Turtle()
>>> t1.color
'green'
>>> t1.weight
10
>>> t1.legs
4
>>> t1.shell
True
>>> t1.mount
'大嘴'
>>> t1.climb()
我正在努力的向前爬
>>> t1.run()
我正在飞快的向前怕
>>> t1.bite()
咬死你咬死你
>>> t1.eat()
有的吃真满足
>>> t1.sleep()
困了困了

二.封装

在创建对象之前,通过类将相关的属性和方法给打包到一起。然后再通过类来生成相应的对象

>>> class C:
...     def hello():
...             print('hello')
...
>>> c = C()
>>> c.hello()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: C.hello() takes 0 positional arguments but 1 was given

>>> class C:
...     def getSelf(self):
...             print(self)
...
>>> c = C()
>>> c.getSelf()
<__main__.C object at 0x000001536290D2E0>
>>> c
<__main__.C object at 0x000001536290D2E0>

传递到方法中self参数的实参就是实例对象本身

一个类可以生成无数个对象,当调用类中的方法时,python为了明确是哪一个实例对象在调用该方法,于是使用self参数将调用该方法的实例对象的信息进行了传递。

三.继承

当子类继承父类时,子类拥有和父类相同的方法和相同的属性

>>> class A:
...     x = 1
...     def hell(self):
...             print('你好')
...
>>> class B(A):
...     def bb(self):
...             print('我是B的对像')
...
>>> b = B()
>>> b.x
1
>>> b.bb()
我是B的对像
>>> b.hell()
你好
>>> class B(A):
...     x = 123
...     def hello(self):
...             print('我是B的对象')
...
>>> b = B()
>>> b.x
123
>>> b.hello()
我是B的对象

isinstance():判断某个对象是否属于某个方法

>>> isinstance(b,B)
True
>>> isinstance(b,A)
True

issubclass():检测一个类是否为某个类的子类

>>> issubclass(B,A)
True

多重继承

>>> class A:
...     x = 1
...     def hello(self):
...             print('你好')
...
>>>
>>> class B():
...     x = 123
...     def hello(self):
...             print('这里是B')
...
>>> class C(A,B):
...     pass
...
>>> c = C()
>>> c.x
1
>>> c.hello()
你好

多重继承时,多个父类拥有同样的属性和方法,子类对象调用时优先级从左至右。

组合:

组合(将需要的类一起进行实例化并放入新的类中),非继承关系的几个类放到一起

>>> class A:
...     def hello(self):
...             print('这里是A')
...
>>> class B:
...     def hello(self):
...             print('这里是B')
...
>>> class C:
...     def hello(self):
...             print('这里是C')
...
>>> class ABC:
...     a = A()
...     b = B()
...     c = C()
...     def hello(self):
...             self.a.hello()
...             self.b.hello()
...             self.c.hello()
...
>>> abc = ABC()
>>> abc.hello()
这里是A
这里是B
这里是C

绑定

实例对象跟类的方法进行绑定

实例能拥有自己的属性,如果要通过类的方法对属性进行操作,则需要使用self进行绑定

>>> class A:
...     x = 120
...     def set_x(self,i):
...             self.x = i
...
>>> a = A()
>>> a.set_x(520)
>>> a.x
520

若没有这个self,那么直接对x进行操作,只是在set_x()函数内部创建了一个局部变量x

四.构造函数

构造函数__init__()

在类中定义__intit__()方法,就可以在实例化对象的时候实现一些变量的初始化

如果创建类的时候,没有添加构造函数,python解释器会自动创建一个不执行任何操作的默认构造函数;也就是说,只要创建类,一定会伴随着一个构造函数诞生。只不过可以自定义一个构造函数,也可以由python解释器自动创建一个默认的构造函数。

>>> class go:
...     def __init__(self, x, y):
...             self.x = x
...             self.y = y
...     def add(self):
...             return self.x + self.y
...     def mul(self):
...             return self.x * self.y
...
>>> a = go(3,4)
>>> a.__dict__
{'x': 3, 'y': 4}
>>> a.add()
7
>>> a.mul()
12

五.重写

子类可以重新定义父类已有的属性和方法来对父类中同名的属性和方法进行覆盖。

可以在子类中直接调用父类的方法,即调用未绑定的父类方法。但会造成钻石继承的问题。

>>> class gozi(go):
...     def __init__(self, x, y, z):
...             go.__init__(self, x, y)
...             self.z = z
...     def add(self):
...             return go.add(self) + self.z
...     def mul(self):
...             return self.x * self.y * self.z
...
>>> b = gozi(2, 3, 4)
>>> b.__dict__
{'x': 2, 'y': 3, 'z': 4}
>>> b.add()
9
>>> b.mul()
24

钻石继承问题:

>>> class A:
...     def __init__(self):
...             print('这里是A')
...
>>> class B1(A):
...     def __init__(self):
...             A.__init__(self)
...             print('这里是B1')
...
>>> class B2(A):
...     def __init__(self):
...             A.__init__(self)
...             print('这里是B2')
...
>>> class C(B1, B2):
...     def __init__(self):
...             B1.__init__(self)
...             B2.__init__(self)
...             print('这里是C')
...
>>> c = C()
这里是A
这里是B1
这里是A
这里是B2
这里是C

A被调用了两次,因为C调用B1、B2,B1、B2又分别调用了A。

为了解决砖石继承的问题可以使用super()函数。

>>> class A:
...     def __init__(self):
...             print('这里是A')
...
>>> class B1(A):
...     def __init__(self):
...             super().__init__()
...             print('这里是B1')
...
>>> class B2(A):
...     def __init__(self):
...             super().__init__()
...             print('这里是B2')
...
>>> class C(B1, B2):
...     def __init__(self):
...             super().__init__()
...             print('这里是C')
...
>>> c = C()
这里是A
这里是B2
这里是B1
这里是C

六.多态

同一个运算符、函数或对象在不同的场景下具有不同的作用效果

运算符的多态

>>> 3 + 5
8
>>> 'L' + 'ove'
'Love'

函数的多态

>>> len('love')
4
>>> len(['love','jiji','xixi'])
3
相关推荐
m0_5945263017 分钟前
Python批量合并多个PDF
java·python·pdf
工业互联网专业31 分钟前
Python毕业设计选题:基于Hadoop的租房数据分析系统的设计与实现
vue.js·hadoop·python·flask·毕业设计·源码·课程设计
钱钱钱端38 分钟前
【压力测试】如何确定系统最大并发用户数?
自动化测试·软件测试·python·职场和发展·压力测试·postman
慕卿扬39 分钟前
基于python的机器学习(二)—— 使用Scikit-learn库
笔记·python·学习·机器学习·scikit-learn
Json____1 小时前
python的安装环境Miniconda(Conda 命令管理依赖配置)
开发语言·python·conda·miniconda
小袁在上班1 小时前
Python 单元测试中的 Mocking 与 Stubbing:提高测试效率的关键技术
python·单元测试·log4j
白狐欧莱雅1 小时前
使用python中的pygame简单实现飞机大战游戏
经验分享·python·游戏·pygame
阿_旭1 小时前
基于YOLO11/v10/v8/v5深度学习的维修工具检测识别系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·qt·ai
阿_旭1 小时前
基于YOLO11/v10/v8/v5深度学习的煤矿传送带异物检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
人工智能·python·深度学习·目标检测·yolo11
测试19982 小时前
外包干了2年,快要废了。。。
自动化测试·软件测试·python·面试·职场和发展·单元测试·压力测试