• Python初探之面向对象编程


    概述

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

    面向对象的特征

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

    以上是面向对象的基本特征,那么Python在面向对象方面是如何做的呢?

    创建类

    如下所示:

    • 使用 class 语句来创建一个新类,class 之后为类的名称并以冒号结尾。
    • Python的类,没有大括号表示类的内容范围,而是通过缩进来实现。
    • 类的成员方法和普通方法的区别是,方法定义的第一个参数是self,表示类的实例,但在调用时不需要。
    • 其中__init__方法为类的初始化方法,当声明对象时,会调用对应的方法。
    • 其中__del__方法为析构函数,当类被释放时调用。
     1 class Employee:
     2     """员工类"""
     3     emp_count = 0  # 变量是一个类变量,它的值将在这个类的所有实例之间共享
     4 
     5     def __init__(self, name, salary):
     6         """初始化"""
     7         self.name = name
     8         self.salary = salary
     9         Employee.emp_count += 1
    10 
    11     def display_count(self):
    12         """显示数量"""
    13         print('Total Employee =', Employee.emp_count)
    14 
    15     def display_employee(self):
    16         """显示信息"""
    17         print('name =', self.name, ', salary = ', self.salary)
    18 
    19     def prt(self):
    20         """打印自己"""
    21         print(self)
    22         print(self.__class__)
    23 
    24     def __del__(self):
    25         """析构函数"""
    26         print(self, '被释放了')

    创建对象

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

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

    动态添加与删除对象属性

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

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

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

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

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

    1 # 内置对象
    2 print("Employee.__doc__:", Employee.__doc__)
    3 print("Employee.__name__:", Employee.__name__)
    4 print("Employee.__module__:", Employee.__module__)
    5 print("Employee.__bases__:", Employee.__bases__)
    6 print("Employee.__dict__:", Employee.__dict__)

    类的属性与方法

    • 类的私有属性,以双下划线开头,只可以在类内部通过self进行访问。
    •  类的protected属性,以下划线开头,只允许子类和自身调用。
    • 在类的内部,使用 def 关键字可以为类定义一个方法,与一般函数定义不同,类方法必须包含参数 self,且为第一个参数
    • 类的私有方法:以两个下划线开头,声明该方法为私有方法,不能在类的外部调用。在类的内部调用 self.__private_methods

    如下所示:

    1 class JustCounter:
    2     """类描述"""
    3     __secretCount = 0  # 类的私有变量
    4     publicCount = 0  # 公开变量
    5 
    6     def count(self):
    7         self.__secretCount += 1
    8         self.publicCount += 1
    9         print('私有变量:', self.__secretCount)

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

    1 print(counter._JustCounter__secretCount)

    类的继承

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

    • Python中的继承通过 class 子类名(父类名): 的格式实现。
    • 子类可以调用父类的方法和定义自己的方法。
    • 如果父类方法的功能不能满足需求,子类可以重写(overrides)父类的方法。

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

     1 class Parent:
     2     """定义父类"""
     3     parentAttr = 100
     4 
     5     def __init__(self):
     6         print('调用父类的构造函数')
     7 
     8     def parentMethod(self):
     9         print('调用父类方法')
    10 
    11     def setAttr(self, attr):
    12         Parent.parentAttr = attr
    13 
    14     def getAttr(self):
    15         print('父类属性:', Parent.parentAttr)
    16 
    17     def myMethod(self):
    18         print('我是父类的MyMethod')

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

     1 class Child(Parent):
     2     """定义子类"""
     3 
     4     def __init__(self):
     5         print('调用子类的构造方法')
     6 
     7     def childMethod(self):
     8         print('调用子类方法')
     9 
    10     def myMethod(self):
    11         """重写Overrides父类方法"""
    12         print('我是子类的MyMethod')
    13 
    14     def __str__(self):
    15         """重写方法,适合人阅读"""
    16         return 'str方法返回'

    子类的实例化

    如下所示:

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

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

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

    备注

    天净沙·秋思

    作者:马致远

    枯藤老树昏鸦,小桥流水人家,古道西风瘦马。夕阳西下,断肠人在天涯。
  • 相关阅读:
    开发工具
    人脸识别
    mysql 3813:Column check constraint 'tb_course_chk_3' references other column.
    sleep()和wait()的异同
    线程通信——wait(),notify(),notifyAll()
    对王建民老师的评价&JAVA结课自我总结
    JAVA学习日报 12/19
    JAVA学习日报 12/18
    JAVA学习日报 12/17
    JAVA学习日报 12/11
  • 原文地址:https://www.cnblogs.com/hsiang/p/13069027.html
Copyright © 2020-2023  润新知