Python面向对象编程-初级篇

简介: 面向对象相关概念,获取、添加对象属性,魔法方法,Python的内置属性等

前言

面向对象 : 采用基于对象(实体) 的概念建立模型,模拟客观世界分析、设计、实现软件的办法。面向对象编程(Object-oriented Programming,简称 OOP)是一种解决软件复用的设计和编程方法,把软件系统中相近相似的操作逻辑和操作应用数据、状态,以类的形式描述出来,以对象实例的形式在软件系统中复用,提高软件开发效率。

面向对象编程是Python中一个极为重要的概念。

一、面向对象和面向过程

1.两类软件开发设计方法

  1. 面向过程编程:根据业务逻辑从上往下,将需要用到的功能代码封装到函数中,着重关注开发的步骤和过程,典型代码为C语言(关注过程)
  2. 面向对象编程:将函数或所需要的功能进行分类和封装,着重关注具体哪个类和函数来实现功能,典型代码为Java、C++等语言(关注结果)

2.面向对象相关术语

  • 类(Class):用来描述具有相同属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法,对象是类的实例。
  • 实例:也称对象。通过类定义的初始化方法,赋予具体的值,成为一个”有血有肉的实体”。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
  • 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
  • 方法:类中定义的函数。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重 写。
  • 静态方法:不需要实例化就可以由类执行的方法。
  • 类方法:类方法是将类本身作为对象进行操作的方法。

面向对象三大特性:

  • 封装:将内部实现包裹起来,对外透明,提供api接口进行调用的机制。
  • 继承:即一个派生类(derived class)继承父类(base class)的变量和方法。
  • 多态:根据对象类型的不同以不同的方式进行处理。

二、类和对象

1.对象

对象是面向对象编程的核心,在使用对象过程中,为了将具有共同特征和行为的一组对象抽象定义,形成类

2.类

1)概念

类是一类事物,对象即是这一类事物的具体实现,类具有相同的属性和行为

2)类(class)的组成

  • 类名:类的名称
  • 属性:事物的特征
  • 方法:具体做什么

3)抽象

拥有相同或类似属性和行为的对象都可以抽象成一个类

4)类的分类

创建类使用class关键字,带上类名,再带上括号,括号内为object,这样的类称为:新式类;也可以不带括号和括号内的object,这样的类称为:经典类。

# 新式类 classMeeting2(object): 
pass# 经典类 classMeeting2: 
pass

5)创建对象

A=Meeting1() 
B=Meeting2()

6)self

类方法的第一个参数必须是self(按惯例是self,也可以是其他名称),调用时不必传入。self代表类的实例

三、获取或添加对象属性

如下有个名为meeting的类,类中初始化了name、age、sex、address、attack等属性,定义了introduction和attacked两个方法:

classMeeting(object):
"""meeting类的类描述"""def__init__(self, name, age, sex, address, attack):
"""构造函数"""self.name=nameself.age=int(age)
self.sex=sexself.address=addressself.attack=int(attack)
defintroduction(self):
print("姓名:{}".format(self.name))
print("年龄:{}".format(self.age))
print("性别:{}".format(self.sex))
print("地址:{}".format(self.address))
defattacked(self):
print(f"{self.name}正在向您发起攻击,攻击力为{self.attack}!")
defforeign_fun():
print("我是外部函数")

1.hasattr-检查对象是否包含指定属性或方法

用法:

hasattr(object,name)

作用:检查对象中是否包含指定属性或方法

返回值:存在返回true、不存在返回false

# 实例化meeting类Meeting=Meeting("张三", 20, "男", "南京", 108)
# 获取Meeting对象中是否存在name属性print(hasattr(Meeting, "name"))  # True# 获取Meeting对象中是否存在mobile属性print(hasattr(Meeting, "mobile"))  # False# 获取Meeting对象中是否存在attacked方法print(hasattr(Meeting, "attacked"))  # True

2.getattr-获取对象中指定属性的属性值

用法:

getattr(object,name[,default])

作用:获取对象中指定属性的属性值

返回值:若存在,则返回该属性的属性值;若不存在,则返回指定内容

# 实例化meeting类Meeting=Meeting("张三", 20, "男", "南京", 108)
# 获取Meeting对象中name属性的属性值print(getattr(Meeting, "name"))  # 张三# 获取Meeting对象中kills属性或方法的值,若不存在则返回指定内容print(getattr(Meeting, "kills", "未找到kills方法或属性"))  # 未找到kills方法或属性# 获取Meeting对象中attacked方法,返回值为函数地址print(getattr(Meeting, "attacked"))
# 使用getattr方法可以直接调用Meeting对象中的方法f=getattr(Meeting, "attacked")
f()

打印结果如下:

3.setattr-为object对象的name属性设置指定value

用法:

setattr(object,name,value)

作用:为object对象的指定属性设置指定value

返回值:

# 实例化meeting类Meeting=Meeting("张三", 20, "男", "南京", 108)
# 将对象中name属性的值改为“刘德华”setattr(Meeting, "name", "刘德华")
# 获取对象中name的属性值print(getattr(Meeting, "name"))  # 刘德华# 将对象外部的名为foreign_fun的方法引入对象内部,并重新命名为“new_foreign_fun”setattr(Meeting, "new_foreign_fun", foreign_fun)
# 获取对象中是否存在foreign_fun的属性或方法,返回值为True或Falseprint(hasattr(Meeting, "foreign_fun"))  # False# 获取对象中是否存在new_foreign_fun的属性或方法,返回值为True或Falseprint(hasattr(Meeting, "new_foreign_fun"))  # True

打印结果如下:

四、魔法方法

1.__init__() 构造函数

__init__()方法是Python中一种特殊的方法,被称为构造函数或初始化方法,当创建这个类的实例时就会调用该方法。

classMeeting(object):
"""meeting类的类描述"""def__init__(self, name, age, sex, address, attack):
"""构造函数"""self.name=nameself.age=int(age)
self.sex=sexself.address=addressself.attack=int(attack)
C=Meeting("张三", 20, "男", "南京", 108)
print(C.name)  # 张三print(C.address)  # 南京

2.__del__() 析构函数

当删除对象时,Python解释器会默认调用一个方法__del__(),相当于unittest框架中的tearDown()函数

def__del__(self): 
"""析构函数"""print("%s攻击结束"% (self.name))

每调用一次对象,都会执行一次__del__()方法

3.引用计数

D=Meeting("张三", 20, "男", "南京", 108)
# 计算当前实例引用计数,D引用一次,sys.getrefcount(D)引用一次print(sys.getrefcount(D))  # 2

D对象的引用计数为2次,一次是D引用,一次是sys.getrefcount所引用的

4.__str()__字符串函数

__str__方法需要返回一个字符串,当做这个对象的描述信息,当使用print输出对象的时候,只要定义了__str__(self)方法,那么就会打印这个方法返回的数据

def__str__(self):
"""字符串函数"""return"我是Meeting类的字符串描述"# __str__():字符串函数,定义__str__()方法时,打印对象,打印的是__str__()方法的返回值,否则打印类的内存地址print(D)  # 我是Meeting类的字符串描述
  • 未定义__str__()方法时,打印对象,打印的是Meeting类的内存地址:<__main__.Meeting object at0x014A7748>
  • 定义了__str__()方法后,打印对象,打印的是__str__()方法的返回值:我是Meeting类的字符串描述

五、Python的内置属性

1.__dict__:获取类的属性

获取类的属性,包含一个字典,由类的数据属性组成

# __dict__:获取类的属性,返回值为字典类型 print(D.__dict__) 
# {'name': '张三', 'age': 20, 'sex': '男', 'address': '南京', 'attack': 108}

2.__doc__:获取类的文档字符串

 

classMeeting(object): 
"""meeting1类的类描述"""# __doc__:获取类的文档字符串 print(D.__doc__) # meeting1类的类描述

3.__name__:获取类名

# __name__:获取类名 print(Meeting.__name__) # Meeting

4.__module__:类定义所在的模块

类的全名是'__main__.clssName',如果类位于一个导入模块mymod中,那么className.__module__等于mymod

fromcommon.http_requestsimportHttpRequests# __module__:类定义所在的模块print(Meeting.__module__)  # __main__print(HttpRequests.__module__)  # common.http_requests

Meeting类的路径为__main__,而从common文件的http_requests文件中导入了HttpRequests类,打印其路径,则为common.http_requests

5.__bases__:获取类的所有父类构成元素

获取类的所有父类构成元素(包含了一个由所有父类元素组成的元组)。例如下面有一个Song类,其继承了父类Music,则获取到的Song类的所有父类构成元素为:(<class '__main__.Music'>,)

classMusic(object):
passclassSong(Music):
passprint(Song.__bases__)  # (<class '__main__.Music'>,)

小结

本篇文章我们介绍了面向对象的相关概念,下面来简单总结一下:

面向对象相关概念:

  • 类和对象:类是一类事物,对象即是这一类事物的具体实现,类具有相同的属性和行为;
  • 类的组成:类名、属性、方法
  • 带object的为新式类,不带object的为经典类

获取或添加对象属性:

  • hasattr:检查对象是否包含指定属性或方法
  • getattr:获取对象中指定属性的属性值
  • setattr:为object对象的name属性设置指定value

魔法方法:

  • __init__() 构造函数:又叫初始化方法,用来初始化一些成员变量
  • __del__() 析构函数:每调用一次对象,都会执行一次__del__()方法,相当于Unittest框架中的tearDown
  • __str()__字符串函数:返回一个字符串,当做这个对象的描述信息

Python内置属性:

  • __dict__:获取类的属性,返回值为字典类型
  • __doc__:获取类的文档字符串
  • __name__:获取类名
  • __module__:类定义所在的模块
  • __bases__:获取类的所有父类构成元素,返回类型为元组
相关文章
|
1月前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
22 2
|
1月前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
20 1
|
6月前
|
Python
Python编程作业五:面向对象编程
Python编程作业五:面向对象编程
71 1
|
2月前
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
17 3
|
6月前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
2月前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
|
1月前
|
Java Python
Python学习六:面向对象编程(上)
这篇文章是关于Python面向对象编程的基础知识,包括类和对象的概念、实例方法、属性、self关键字以及魔法方法等。
16 0
|
2月前
|
Python
全网最适合入门的面向对象编程教程:Python函数方法与接口-函数与方法的区别和lamda匿名函数
【9月更文挑战第15天】在 Python 中,函数与方法有所区别:函数是独立的代码块,可通过函数名直接调用,不依赖特定类或对象;方法则是与类或对象关联的函数,通常在类内部定义并通过对象调用。Lambda 函数是一种简洁的匿名函数定义方式,常用于简单的操作或作为其他函数的参数。根据需求,可选择使用函数、方法或 lambda 函数来实现代码逻辑。
|
3月前
|
Python
Python 中的面向对象编程 (OOP)
【8月更文挑战第29天】
34 7
|
3月前
|
机器学习/深度学习 PHP 开发者
探索PHP中的面向对象编程构建你的首个机器学习模型:以Python和scikit-learn为例
【8月更文挑战第30天】在PHP的世界中,面向对象编程(OOP)是一块基石,它让代码更加模块化、易于管理和维护。本文将深入探讨PHP中面向对象的魔法,从类和对象的定义开始,到继承、多态性、封装等核心概念,再到实战中如何应用这些理念来构建更健壮的应用。我们将通过示例代码,一起见证PHP中OOP的魔力,并理解其背后的设计哲学。