python知识整合(面向对象程序设计)

1、面向对象概述

1.1、对象(object)

对象是一个抽象的概念,表示任意存在的事物

对象可以分为2部分,就是静态部分和动态部分。静态部分被称为“属性”,如人的性别;动态部分指的是对象的行为(对象执行的动作),如人可以走路

在python中,一切都是对象,即不仅把具体事物称为对象,字符串、函数等也是对象。(pyhton天生就是面向对象的)

1.2、类

类是封装对象的属性和行为的载体,反过来说具有相同属性和行为的一类实体被称为类。
如定义一个鸟类,在该类中可以定义每个对象共有的属性和方法。而每一只鸟就是一个对象。
对象是类的实例

1.3、面向对象程序设计特点

面向对象程序设计具有3大基本特征:封装,继承,多态。

1、封装

封装是面向对象编程的核心思想,将对象的属性和行为封装起来,载体是类。类通常会对客户隐藏其实现细节。如我们看一本书,只需要看书的内容就可以,而不需要知道书是这么制作的。

封装思想保证了类内部数据结构的完整性,提高了程序的可维护性。

2、继承
矩形是四边形的一种,矩形拥有四边形的全部特点,反之不然。
矩形类可以看为继承四边形类后产生的类,称为子类。而四边形类称为父类或者超类。
在python中子类的实例都是父类的实例,但是不能说父类的实例都是子类的实例。
继承是重复利用的重要手段,子类可以继承父类的属性的同时,又增加了子类特有的属性和行为。

3、多态
将父类对象应用于子类的特征就是多态。
就是子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同的效果,这就是多态化结构。

2、类的定义和使用

2.1、定义类

使用class关键字来定义类
语法格式

class ClassName:
    '''类的帮助信息'''        # 类文档字符串
    statement               # 类体 ,如果没有想好类的功能,可以使用pass代替

2.2、创建类的实例对象

创建类的实例的语法:

ClassName(parameterlist)

注意在python中创建实例不使用new关键字,这是它与其他面向对象语言的区别。

2.3、创建 int ()方法

int ()方法是一个特殊的方法,每当创建一个类的新实例时,Python会自动执行它。

int ()方法必须包含一个self参数,且必须是第一个参数。self参数是一个指向实例本身的引用,用于访问类中的属性和方法。在方法调用时会自动传递实际参数self

class Apple:
    """苹果类"""
    def __init__(self):
        print("这是苹果类")


wildApple = Apple()

可以看出,在创建苹果类的实例时,虽然没有为 int ()方法指定参数,但是该方法会自动执行

当然 int ()方法出了self参数外,还可以自定义一些参数。
例子

class Apple:
    """苹果类"""
    def __init__(self, size, color):      # 构造方法
        print("这是苹果")
        print(size)
        print(color)


size_1 = “个大”
color_1 = “又红”
wildApple = Apple(size_1, color_1) # 创建苹果类的实例

2.4、创建类的成员并访问

类的成员主要由实例的方法和数据成员组成。创建了类的成员后,可以通过类的实例进行访问

1、创建实例方法并访问

实例方法其实就是在类中定义函数

int()方法类似
语法格式如下

def  functionName(self,parameterlist):
    block

参数说明:
functionName:用于指定方法名,一般小写字母开头

self : 必要参数,其名称要是self以外的单词,用self只是个习惯

parameterlist: 用于指定除self以外的参数

block: 方法体,实现具体功能

实例方法创建完成之后,可以通过类的实例名称名称和“.”来访问。
语法格式

instanceName.functionName(parametervalue)

2、创建数据成员并访问
数据成员是指类中定义的变量(属性),根据定义的位置可以分为类属性和实例属性。

类属性:定义在类中且在函数体外的属性。可以在使用实例化的对象中公用。

实例属性定义在类的方法(实例方法)中的属性,只作用于当前的实例。

class Apple:
    """苹果类"""
    size = "个大"             # 定义类属性
    color = "又红"            # 定义类属性

    def __init__(self):       # 构造方法
        self.weight = "又重"
        print("这是苹果")
        print(Apple.size)
        print(Apple.color)
        print(self.weight)     # 定义实例属性


apple = Apple() # 创建苹果类的实例

注意实例属性只能通过实例名访问。当然实例属性也可以通过实例名称修改,修改后不影响该类的其他的实例中相应的实例属性的值

class Apple:
    """苹果类"""

    def __init__(self):       # 构造方法
        self.weight = "又重"
        print(self.weight)     # 定义实例属性


apple1 = Apple()
apple2 = Apple()
apple1.weight = “太轻了”
print(apple1.weight)
print(apple2.weight)

2.5、访问限制

访问限制有3种方式。可以在属性或者方法前加个单下划线,双下划线,或者首尾加双下划线

1、首尾加双下划线:表示定义的特殊方法,一般是系统定义的名字如int()

2、单下划线:表示保护(protected)类型的成员,只允许类本身或者子类访问,但不可以使用“from module import*”语句导入

如:

class Apple:
    """苹果类"""
    _weight_apple = "又重"   # 定义保护属性

    def __init__(self):       # 实例方法
        print(Apple._weight_apple)     # 在实例方法中访问保护属性


apple1 = Apple()
print(apple1._weight_apple)

保护属性可以通过实例名进行访问

3、双下划线:表示私有(private)类型成员,只允许定义该方法的类的本身进行访问,而且不能通过类的实例进行访问。但是可以通过”类的实例名._类名__xxx”进行访问

class Apple:
    """苹果类"""
    __weight_apple = "又重"   # 定义私有属性

    def __init__(self):       # 实例方法
        print(Apple.__weight_apple)     # 在实例方法中访问私有属性


apple1 = Apple()
print(apple1._Apple__weight_apple)

3、属性(property)

3.1、创建用于计算的属性

可以通过@property(装饰器)把一个方法转化为属性,从而实现用于计算的属性。可以直接通过方法名来访问。
语法格式

@property
def methodname(self)
    block

class Rect:
    def __init__(self, width, height):
        self.width = width           # 矩形的宽
        self.height = height         # 矩形的高

    @property                        # 将方法转化为属性
    def area(self):
        return self.width*self.height    # 返回矩形的面积


rect = Rect(5, 4) # 创建类的实例
print(rect.area) # 输出属性的值

3.2、为属性添加安全的保护机制

如果想要创建一个可读不能修改的属性,那么可以使用@property(装饰器)实现该效果

例子:

class Rect:
    def __init__(self, width):
        self.width = width           # 矩形的宽

    @property                        # 将方法转化为属性
    def area(self):
        return self.width


rect = Rect(5) # 创建类的实例
print(rect.area) # 输出属性的值
rect.area = 6 # 修改属性值
print(rect.area) # 获取属性值,会抛出AttributeError

4、继承

4.1、继承的基本语法:

语法格式:

class ClassName(baseclasslist):
    """类的帮助信息"""                   # 类文档字符串
    statement                          # 类体

部分参数说明:
baseclasslist:用于指定要继承的基类(父类),可以多个。类名之间用逗号隔开。如果不指定,将使用所以python对象的根类object.

4.2、方法重写

基类(父类)的成员都会被派生类(子类)继承,当基类中的某个方法不完全适用于派生类时,就需要在派生类中重写基类的这个方法。
例子:重写基类中的harvest方法

class Fruit:
    def __init__(self, color = "绿色"):
        Fruit.color = color             # 定义类的属性

    def harvest(self):
        print("水果……")


class Orange(Fruit):
color = “橙色”

def __init__(self):
    print("\n我是橘子")
    super().__init__()                   # 调用基类的__init__()方法

def harvest(self, color):
    print("橘子是:" + color + "的")      # 输出参数形式color
    print("橘子已经收获了")
    print("橘子原来是:" + Fruit.color + "的")   #输出类属性color


orange = Orange()
orange.harvest(“橙色”)

这边有一点要注意,在派生类中定义init()方法时,不会自动调用基类的init()方法。故需要对派生类的init()方法进行初始化,就是在派生类中只有super()函数进行调用基类的init()方法,如下代码

1
super().__init__()
0%