Python基础之面向对象编程

简介: Python基础之面向对象编程

概述

很多人接触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))  # 判断是否是实例对象

备注

天净沙·秋思

作者:马致远

枯藤老树昏鸦,小桥流水人家,古道西风瘦马。夕阳西下,断肠人在天涯。

相关文章
|
30天前
|
Java C# Python
Python学习七:面向对象编程(中)
这篇文章是关于Python面向对象编程的中级教程,涵盖了析构函数、对象的三大特征(封装、继承、多态)、类属性与实例属性、以及类方法与静态方法的对比。
21 2
|
30天前
|
设计模式 安全 JavaScript
Python学习八:面向对象编程(下):异常、私有等
这篇文章详细介绍了Python面向对象编程中的私有属性、私有方法、异常处理及动态添加属性和方法等关键概念。
20 1
|
6月前
|
Python
Python编程作业五:面向对象编程
Python编程作业五:面向对象编程
67 1
|
2月前
|
存储 Java 程序员
30天拿下Python之面向对象编程
30天拿下Python之面向对象编程
17 3
|
6月前
|
Python
【Python进阶(三)】——面向对象编程
【Python进阶(三)】——面向对象编程
|
2月前
|
Java Python
全网最适合入门的面向对象编程教程:50 Python函数方法与接口-接口和抽象基类
【9月更文挑战第18天】在 Python 中,虽无明确的 `interface` 关键字,但可通过约定实现类似功能。接口主要规定了需实现的方法,不提供具体实现。抽象基类(ABC)则通过 `@abstractmethod` 装饰器定义抽象方法,子类必须实现这些方法。使用抽象基类可使继承结构更清晰、规范,并确保子类遵循指定的方法实现。然而,其使用应根据实际需求决定,避免过度设计导致代码复杂。
|
30天前
|
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的魔力,并理解其背后的设计哲学。
下一篇
无影云桌面