【Python学习笔记】十三.Python3面向对象

相关笔记链接:
【Python学习笔记】一.Python3基础语法
【Python学习笔记】二.Python3基本数据类型
【Python学习笔记】三.Python3数据类型转换
【Python学习笔记】四.Python3推导式
【Python学习笔记】五.Python3解释器
【Python学习笔记】六.Python3注释
【Python学习笔记】七.Python3运算符
【Python学习笔记】八.Python3条件控制
【Python学习笔记】九.Python3循环语句
【Python学习笔记】十.Python3迭代器与生成器
【Python学习笔记】十一.Python3函数
【Python学习笔记】十二.Python3模块

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。


1.面向对象技术简介

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 方法:类中定义的函数
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。(PHP的成员变量)
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写
  • 局部变量:定义在方法中的变量,只作用于当前实例的类。
  • 实例变量:在类的声明中,属性是用变量来表示的,这种变量就称为实例变量,实例变量就是一个用 self 修饰的变量。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。
  • 实例化创建一个类的实例,类的具体对象。
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法

2.类定义

# class为类的关键字,ClassName是类的名称
class ClassName:
    <statement-1>
    .
    .
    .
    <statement-N>

3.类对象

3.1.类的定义及实例化

类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是self

代码示例:

class PrintMessage:
    """定义一个一个打印信息的类"""
    # 定义类的成员属性date
    date = '2022-05-15'

	# 定义类的成员方法f1
    def f1(self):
        return 'hello world'

	# 定义类的成员方法f2
    def f2(self):
        return 'welcome to China'


# 实例化这个类
x = PrintMessage()
# 调用类的成员属性和成员方法
print("PrintMessage类的属性date为:", x.date)
print("PrintMessage类的方法f1为:", x.f1())
print("PrintMessage类的方法f2为:", x.f2())

"""输出结果为:
PrintMessage类的属性date为: 2022-05-15
PrintMessage类的方法f1为: hello world
PrintMessage类的方法f2为: welcome to China
"""

3.2.构造方法__init__

构造方法__init__() 在类实例化时会自动调用。

代码示例:

class PrintMessage:
    """一个打印信息的类"""
    date = '2022-05-15'

    def __init__(self):
        print("这是构造方法")

    def f1(self):
        return 'hello world'

    def f2(self):
        return 'welcome to China'


x = PrintMessage()
"""输出结果为:
这是构造方法
"""

3.3.带参数的构造方法

代码示例:

class PrintMessage:
    """一个打印信息的类"""

    def __init__(self, month):
    	# 构造方法根据传入的参数month,给成员属性赋值
        self.month = month
        print("这是构造方法")


# 实例化类的时候,传入参数;参数交给__init__构造方法
x = PrintMessage('5月')
print("当前月份为:", x.month)

4.类的方法

  • 在类的内部,使用def 关键字来定义一个方法
  • 与一般函数定义不同,类方法必须包含参数 self, 且为第一个参数,self 代表的是类的实例。

代码示例:

class Person:
    """定义类的基本属性"""
    name = ''
    age = 0
    """私有属性用__开头"""
    __weight = 0

    def __init__(self, name, age, weight):
        self.name = name
        self.age = age
        self.__weight = weight

    def speak(self):
        print("姓名:", self.name, ',年龄:', self.age, "体重:", self.__weight)

# 实例化类
person1 = Person('allen', 20, '65kg')
person2 = Person('allenpandas', 25, '70kg')

# 调用类内的方法
person1.speak()
person2.speak()

5.继承

继承结构:

class DerivedClassName(BaseClassName):
    <statement-1>
    .
    .
    .
    <statement-N>

代码示例:

class Person:
    """定义类的基本属性"""
    name = ''
    age = 0
    """私有属性用__开头"""
    __weight = 0

    def __init__(self, name, age, weight):
        self.name = name
        self.age = age
        self.__weight = weight

    def speak(self):
        print("姓名:", self.name, ',年龄:', self.age, "体重:", self.__weight)


class Student(Person):  # 继承自Person类
    """定义类的基本属性"""
    grade = ''
    def __init__(self, name, age, weight, grade):

        # 继承父类的构造函数
        Person.__init__(self, name, age, weight)
        # 自己的构造函数,给成员属性赋值
        self.grade = grade

    def speak(self):
        print("我是:", self.name, ', 年龄:', self.age, ", 年级为:", self.grade)


# name, age, weight都是继承自父类的,grade是子类,通过实例化传参得到的
student1 = Student('allenpandas', '25', '75kg', '研究生一年级')
student1.speak()

6.多继承

  • Python同样有限的支持多继承形式。
  • 需要注意圆括号中父类的顺序,若是父类中有相同的方法名,而在子类使用时未指定,python从左至右搜索。

多继承结构:

class DerivedClassName(Base1, Base2, Base3):
    <statement-1>
    .
    .
    .
    <statement-N>

7.方法重写

代码示例:

class Parent:
    def speak(self):
        print('这是父类的方法')

    def eat(self):
        print('这是父类的方法')


class Student(Parent):
    def speak(self):
        print('这是子类的方法')


# 实例化类
student1 = Student()
# 子类的speak方法覆盖了父类的speak方法,所以student1的speak输出为“这是子类的方法”
student1.speak()
# 子类继承了父类的eat方法,所以student1的eat输出为“这是父类的方法”
student1.eat()

8.类的属性与方法

8.1.私有属性和公有属性

  • 私有属性:__weight,只能类内使用。
  • 公有属性:weight

代码示例:

class Student:
    age = 18
    __weight = '60kg'


# 实例化
student1 = Student()
print("student1的公有属性age为:", student1.age)  # 正常输出
print("student1的私有属性__weight为:", student1.__weight)  # 报错

"""输出结果为:
student1的公有属性age为: 18
Traceback (most recent call last):
  File "/Users/allenpandas/Project/learning-language/xxx.py", line 101, in <module>
    print("student1的私有属性__weight为:", student1.__weight)
AttributeError: 'Student' object has no attribute '__weight'
"""

8.2.私有方法和共有方法

  • 私有方法:__speak(self),只能类内使用。
  • 共有方法:speak(self)

代码示例:

class Student:

    def speak(self):
        print('这是共有方法')

    def __speak(self):
        print('这是私有方法')


# 实例化
student1 = Student()
student1.speak()  # 调用公有方法,正常输出
student1.__speak()  # 调用私有方法,报错

"""输出结果为:
这是共有方法
Traceback (most recent call last):
  File "/Users/allenpandas/Project/learning-language/xxx.py", line 117, in <module>
    student1.__speak()
AttributeError: 'Student' object has no attribute '__speak'

"""

8.3.类的专有方法

__init__ : 构造函数,在生成对象时调用
__del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__truediv__: 除运算
__mod__: 求余运算
__pow__: 乘方

版权声明:本文为m0_38068876原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。