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__()方法,如下代码
super().__init__()