浅析Python面向对象编程

作者:Alan.hsiang 时间:2023-11-23 07:52:12 

概述

很多人接触Python,都是从爬虫开始,其实很多语言都可以做爬虫,只是Python相对其他语言来说,更加简单而已。但是Python并不止于爬虫,在人工智能,科学计算等方面的应用更加广泛。古人云:万丈高楼平地起,要想有长足的发展,打好基础很重要,本文主要讲解Python的面向对象相关知识,仅供学习分享使用,如有不足之处,还请指正。

面向对象的特征

类:用来描述相同事物的特征的集合,如:Person 类,表示人,具有人的属性和特征。
对象:通过类定义的具体的实例,如:zhangsan 表示一个具体的人。
继承:是指派生类继承基类的方法和属性,并具有自己属性和特征,如:Man是Person的子类。
封装:隐藏数据和实现细节,提供对外访问方法。
多态:一个基类,可以有多个派生类,可以有不同的形态。
抽象:抛开细节,只关注本质特征的过程。
以上是面向对象的基本特征,那么Python在面向对象方面是如何做的呢?

创建类

如下所示:

  • 使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾。

  • Python的类,没有大括号表示类的内容范围,而是通过缩进来实现。

  • 类的成员方法和普通方法的区别是,方法定义的第一个参数是self,表示类的实例,但在调用时不需要。

  • 其中__init__方法为类的初始化方法,当声明对象时,会调用对应的方法。

  • 其中__del__方法为析构函数,当类被释放时调用。


class Employee:
 """员工类"""
 emp_count = 0 # 变量是一个类变量,它的值将在这个类的所有实例之间共享

def __init__(self, name, salary):
   """初始化"""
   self.name = name
   self.salary = salary
   Employee.emp_count += 1

def display_count(self):
   """显示数量"""
   print('Total Employee =', Employee.emp_count)

def display_employee(self):
   """显示信息"""
   print('name =', self.name, ', salary = ', self.salary)

def prt(self):
   """打印自己"""
   print(self)
   print(self.__class__)

def __del__(self):
   """析构函数"""
   print(self, '被释放了')

创建对象

Python创建对象,不需要new关键字,类似于函数的调用,和Java及.Net不同。如下所示:


'创建第一个对象'
emp = Employee('Jack', 20)
emp.display_count()
emp.display_employee()
emp.prt()

动态添加与删除对象属性

对象的属性可以动态添加,这点与编译型语言不同,如下所示:


emp.age = 17 # 添加一个 'age' 属性
emp.age = 28 # 修改 'age' 属性
del emp.age # 删除 'age' 属性

也可以通过Python的内置方法来添加和获取属性,如下所示:


print(getattr(emp, 'name')) # 获取属性
print(hasattr(emp, 'age')) # 是否包含属性
setattr(emp, 'age', 18) # 设置属性和值
print(hasattr(emp, 'age')) # 是否包含属性
print(getattr(emp, 'age')) # 获取属性
delattr(emp, 'age') # 删除属性
print(hasattr(emp, 'age')) # 是否包含属性

Python也有内置类的一些属性,如下所示:


# 内置对象
print("Employee.__doc__:", Employee.__doc__)
print("Employee.__name__:", Employee.__name__)
print("Employee.__module__:", Employee.__module__)
print("Employee.__bases__:", Employee.__bases__)
print("Employee.__dict__:", Employee.__dict__)

类的属性与方法

  • 类的私有属性,以双下划线开头,只可以在类内部通过self进行访问。

  • 类的protected属性,以下划线开头,只允许子类和自身调用。

  • 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数

  • 类的私有方法:以两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods

如下所示:


class JustCounter:
 """类描述"""
 __secretCount = 0 # 类的私有变量
 publicCount = 0 # 公开变量

def count(self):
   self.__secretCount += 1
   self.publicCount += 1
   print('私有变量:', self.__secretCount)

Python不允许实例化的类访问私有数据,但你可以使用 object._className__attrName( 对象名._类名__私有属性名 )访问属性,如下所示:

print(counter._JustCounter__secretCount) 

类的继承

面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。

  • Python中的继承通过 class 子类名(父类名): 的格式实现。

  • 子类可以调用父类的方法和定义自己的方法。

  • 如果父类方法的功能不能满足需求,子类可以重写(overrides)父类的方法。

如下所示:Parent表示一个父类,拥有自己的属性和方法。


class Parent:
 """定义父类"""
 parentAttr = 100

def __init__(self):
   print('调用父类的构造函数')

def parentMethod(self):
   print('调用父类方法')

def setAttr(self, attr):
   Parent.parentAttr = attr

def getAttr(self):
   print('父类属性:', Parent.parentAttr)

def myMethod(self):
   print('我是父类的MyMethod')

Child表示一个子类,继承自Parent,如下所示:


class Child(Parent):
 """定义子类"""

def __init__(self):
   print('调用子类的构造方法')

def childMethod(self):
   print('调用子类方法')

def myMethod(self):
   """重写Overrides父类方法"""
   print('我是子类的MyMethod')

def __str__(self):
   """重写方法,适合人阅读"""
   return 'str方法返回'

子类的实例化

如下所示:


c = Child() # 实例化子类对象
c.childMethod() # 调用子类方法
c.parentMethod() # 调用父类方法
c.setAttr(200) # 再次调用父类方法,设置属性
c.getAttr() # 再次调用父类方法 获取属性
c.myMethod() # 调用的是子类的MyMethod

可以通过内置函数,判断子类与类的关系,如下所示:


print(issubclass(Child, Parent)) # 判断是否是对应的父子关系
print(isinstance(c, Child)) # 判断是否是实例对象
print(isinstance(c, Parent)) # 判断是否是实例对象

来源:https://www.cnblogs.com/hsiang/p/13069027.html

标签:Python,面向对象,编程
0
投稿

猜你喜欢

  • unittest+coverage单元测试代码覆盖操作实例详解

    2021-10-09 09:32:24
  • 油猴脚本编写教程详解

    2023-05-26 12:29:51
  • 浅谈mysql可有类似oracle的nvl的函数

    2024-01-28 08:49:37
  • JavaScript学习心得之如何走出初学困境

    2008-12-24 13:30:00
  • Go语言图片处理和生成缩略图的方法

    2024-05-05 09:33:27
  • 解析SQL语句中Replace INTO与INSERT INTO的不同之处

    2024-01-23 05:57:18
  • 更改localhost为其他名字的方法

    2023-11-23 08:07:52
  • 浅谈python中的数字类型与处理工具

    2022-02-09 01:07:30
  • python实现的二叉树算法和kmp算法实例

    2023-08-07 20:50:49
  • 基于go手动写个转发代理服务的代码实现

    2024-04-25 15:11:15
  • Python模拟登录的多种方法(四种)

    2023-06-11 21:08:45
  • 阿里巴巴技术文章分享 Javascript继承机制的实现

    2024-04-30 09:59:16
  • asp上传文件自动重命名方法

    2007-08-24 09:46:00
  • Sql Server表死锁的解决方法分享

    2011-09-01 19:08:00
  • Go库text与template包使用示例详解

    2024-04-26 17:21:16
  • 余弦相似性计算及python代码实现过程解析

    2021-10-15 14:44:56
  • PHP MVC模式在网站架构中的实现分析

    2023-07-22 21:05:14
  • Python 列表理解及使用方法

    2023-08-29 06:55:02
  • Python实现一个转存纯真IP数据库的脚本分享

    2024-01-17 16:43:38
  • Pytest+Request+Allure+Jenkins实现接口自动化

    2021-04-09 13:50:44
  • asp之家 网络编程 m.aspxhome.com