前言
学了python的基本类型, 语法以及常见模块, 这篇来学习一下python中的类和对象, 不做过多的解释和难以理解的文字, 简单的举一些小例子, 写一些示例代码来说明应该如何写类, 以及实例对象, 后面会随着对python的熟悉度会对类和对象有更深的理解, 学到这里之后, 就可以写一些比较像样的python脚本了, 如果你是从第一篇看到这里, 不得不说, 你很棒, 加油!!!!!!
定义
1. 类(class):可以将类比为是一个“模板”或“蓝图”,它定义了一种数据类型的结构和行为。类是用来描述具有相同属性和功能的对象的集合。比如,我们可以定义一个"汽车"类,它包含属性(颜色、品牌、型号等)和方法(启动、加速、刹车等)。类只是一个抽象的概念,并不占用实际的内存空间。
2. 对象(object):对象是类的一个实例(实体),它是根据类定义的具体实体化结果。比如,我们可以根据"汽车"类创建一个具体的"白色的BYD宋Pro"对象。对象是真实存在的,占用实际的内存空间。
3. 类与对象的关系:类定义了一个模板,规定了对象的属性和行为。对象是根据类创建出来的具体实例。我们可以根据一个类创建多个不同的对象,每个对象都拥有相同的属性和方法,但具体的值可能不同。
4. 类的属性和方法:类可以包含属性和方法。属性是类的特征或数据成员,描述对象的状态。方法是类的行为或函数成员,描述对象的行为。例如,汽车类的属性可以是颜色和型号,方法可以是启动和加速。
5. 面向对象编程的好处:面向对象编程将问题分解为更小的、更易管理的部分,提高了代码的可重用性和可维护性。它允许我们将数据和操作封装在一起,隐藏实现的细节,使得代码更加模块化和可扩展。但同时,也会降低一点效率。
示例
代码语言:javascript复制创建类的标准格式 class 类名(object): pass
# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date: 2023-07-30 12:22:36
# @Last Modified by: Mehaei
# @Last Modified time: 2023-07-30 13:20:56
class Car(object):
"""
创建一个名为Car的类
"""
def __init__(self, brand, model, color):
"""
:param brand: 品牌
:param model: 型号
:param color: 颜色
"""
self.brand = brand
self.model = model
self.color = color
def start(self):
"""
汽车启动方法
"""
print("The car is starting.")
def accelerate(self):
"""
汽车加速方法
"""
print("The car is accelerating.")
def stop(self):
"""
汽车停止方法
"""
print("The car is stopping.")
# 实例化一个汽车对象
my_car = Car("BYD", "宋Pro", "White")
# 访问对象的属性
print(f"My car is a {my_car.color} {my_car.brand} {my_car.model}.")
# 调用对象的方法
my_car.start()
my_car.accelerate()
my_car.stop()
这样就创建了一个Car类, 并实例化了一个my_car对象, 可以使用实例化后的对象调用类属性(brand, model, color)和调用类方法(start, accelerate, stop), 同时也可以实例化很多不同的对象
OOP三大特性
Python是一种面向对象编程(OOP)语言,它支持封装、多态和继承这些重要的OOP特性
1. 封装(Encapsulation):
封装是将数据(属性)和操作(方法)封装在一个对象中,以保护数据的安全性和完整性,同时隐藏内部实现细节。通过封装,我们可以将对象的使用和实现分开,使得代码更加模块化、易维护和易扩展。在Python中,通过使用类来实现封装,将数据属性定义为类的成员变量,将操作方法定义为类的成员方法,从而将相关的数据和操作组织在一起。
2. 多态(Polymorphism):
多态是指在不同的对象上执行相同的操作,但可以根据对象的类型,以不同的方式实现这些操作。多态可以增加代码的灵活性和可扩展性。在Python中,多态通常通过继承和方法重写来实现。如果不同的子类都实现了相同的方法,但具体的实现方式不同,那么在调用这个方法时,会根据对象的类型来执行相应的方法。
3. 继承(Inheritance):
继承是指一个类可以继承另一个类的属性和方法,从而实现代码的复用和层次化组织。继承中有两个主要的类别:基类(也称为父类或超类)和派生类(也称为子类)。派生类继承了基类的属性和方法,并可以在此基础上进行扩展和修改。在Python中,使用关键字`class`来定义类,并通过在类名后加括号来指定基类,从而实现继承。
示例
代码语言:javascript复制# -*- coding: utf-8 -*-
# @Author: Mehaei
# @Date: 2023-07-30 12:22:36
# @Last Modified by: Mehaei
# @Last Modified time: 2023-07-30 14:01:23
# 封装
class Car(object):
def __init__(self, name):
self.name = name
def who(self):
pass
# 继承 父类(Car)
class BYDCar(Car):
# 多态
def who(self):
print(f"我是byd汽车")
# 继承 父类(Car)
class ChangChengCar(Car):
# 多态
def who(self):
print(f"我是长城汽车")
# 实例化子类
byd_car = BYDCar("BYD")
cc_car = ChangChengCar("ChangCheng")
def who_are_you(car):
return car.who()
# 调用同一种类方法, 输出不同内容
who_are_you(byd_car) # 输出:我是byd汽车
who_are_you(cc_car) # 输出:我是长城汽车
在上面的例子中,我们定义了一个`Car`类来实现封装,包含一个`who()`方法,但并没有具体的实现。然后我们定义了两个派生类(子类)`BYDCar`和`ChangChengCar`来继承`Car`类,每个派生类(子类)都重写了`who()`方法,实现了多态。最后,我们定义了一个`who_are_you()`函数,它可以接受不同类型的汽车对象作为参数,从而实现了多态的调用。
类的常用函数
issubclass(): 检测一个类是否是另外一个类的子类
代码语言:javascript复制格式1:issubclass(被检测类,父类) 格式2:issubclass(被检测类,(父类1,父类2,父类3...)) 只要有一个是当前被检测的父类, 结果就为True
print(issubclass(Car, ChangChengCar)) # False
print(issubclass(ChangChengCar, Car)) # True
isinstance(): 检测一个对象是否是某个类的对象
代码语言:javascript复制格式1:isinstance(对象,类) 格式2:isinstance(对象,(类1,类2,类3...)) 只要有一个是当前对象的类, 结果就为True
print(isinstance(byd_car, Car)) # True
print(isinstance(byd_car, BYDCar)) # True
print(isinstance(byd_car, ChangChengCar)) # False
hasattr(对象/类,'成员名'): 检测对象/类是否具有某个成员
代码语言:javascript复制print(hasattr(byd_car, "who")) # True
print(hasattr(byd_car, "whoo")) # False
getattr(对象,'成员名'[,成员不存在时的默认值]): 获取对象/类中的成员值
代码语言:javascript复制print(getattr(byd_car, "who"))
# <bound method BYDCar.who of <__main__.BYDCar object at 0x101ee2c50>>
setattr(对象,'成员名',值): 设置或者添加对象/类中的成员
代码语言:javascript复制print(setattr(byd_car, "whoo", lambda x:x)) # None
print(hasattr(byd_car, "whoo")) # True
delattr(对象,成员): 删除对象/类中的成员
代码语言:javascript复制print(delattr(byd_car, "whoo")) # None
print(hasattr(byd_car, "whoo")) # False
dir(对象/类): 获取对象的成员名称列表
代码语言:javascript复制print(dir(byd_car))
"""
['__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'name', 'who']
""" 往期推荐