面向对象编程(oop)
面向对象是Python最重要的特性,在Python中一切数据类型都是面向对象的。
面向对象的编程思想:按照真实世界客观事物的自然规律进行分析,客观世界中存在什么样的实体,构建的软件系统就存在什么样的实体。
例如:在学校里,有学生实体,学生是抽象的描述,称为“类”;而张同学、李同学等具体的学生个体称为“对象”,也称为“实例”;学生有学号、姓名、班级等属性,还有吃饭、走路等操作。
面向对象三大特性:封装性、继承性、多态性
封装性:使外部访问者不能随意存取对象的内部数据,隐藏了对象的内部细节,只保留有限的对外接口。外部访问者不用关心对象的内部细节,操作对象变得简单。
继承性: 特殊类继承一般类,拥有一般类的全部数据和操作。一般类称为“父类”或“超类”,特殊类称为“子类”或“派生类”。
多态性:在父类中成员被子类继承后,可以具有不同的状态或表现行为。
类和对象
Python中的数据类型都是类,类是组成Python程序的基本要素,它封装了一个类对象的数据和操作。
定义类
Python语言中一个类的实现包括类定义和类体。语法格式如下:
class 类名[(父类)]:
类体
输入下面代码
class Animal(): # 创建Animal类
pass
class Books(): # #创建Books类
pass
# 分别创建对应的类对象
a = Animal()
b = Books()
print(id(Animal))
print(type(Animal))
print(type(a))
print(type(b))
代码运行结果
1939387281408
<class 'type'>
<class '__main__.Animal'>
<class '__main__.Books'>
Process finished with exit code 0
注意:object类是所有类的根类,在Python中任何一个类都直接或间接的继承object;代码的pass语句表示什么操作都不执行,用来维持程序结构的完整。
创建、使用和销毁对象
一个对象的生命周期包括创建、使用和销毁。类实例化可生成对象,所以对象也称为“实例”。
创建对象就是在类对象的后面加上一对小括号,表示调用类对象的构造方法,这就创建了一个对象,示例代码如下
class Animal:
pass
'''
Animal()表达式创建了一个对象,并把创建的对象通过“=”赋给animal变量
animal是指向对象的一个引用。通过animal可以使用刚刚创建的对象
'''
animal = Animal()
# print函数实际上是调用了对象的__str__()方法(__str__()是object类的一个方法,
# 用于返回有关该对象的描述信息)输出字符串信息
print(animal)
代码运行结果
<__main__.Animal object at 0x000001A74F1F1970>
销毁对象
Python会实现自动的垃圾回收:当对象没有被引用时(引用计数为0),由垃圾回收器调用__del__()(析构函数),__del__()被称为“析构方法”,用于实现对象被销毁时所需的操作。比如:释放对象占用的资源(例如:打开的文档资源、网络连接等)。我们也可以通过del语句删除对象,系统会自动调用__del__()方法,一般不需要自定义析构方法。
示例代码如下
class Person:
def __del__(self):
print("销毁对象:{0}".format(self))
p1 = Person()
p2 = Person()
del p2
'''
当 p2 的引用被 del 语句删除时
p2 的 __del__ 方法会被调用
但是,p1 的 __del__ 方法可能在程序结束前不会被调用
因为它的引用仍然存在于变量 p1 中
'''
print("程序结束")
代码运行结果
销毁对象:<__main__.Person object at 0x000001B649C01AF0>
程序结束
销毁对象:<__main__.Person object at 0x000001B649C01AC0>
实例变量
“实例变量”就是某个实例(或对象)个体特有的数据。
示例代码如下
class Animal(object):
def __init__(self,name,age,weight,gender):
self.name = name # 定义姓名实例变量
self.age= age # 定义年龄实例变量
self.weight = weight # 定义体重实例变量
self.gender =gender # 定义性别实例变量
animal = Animal('Tom',18,66,1)
animal1 = Animal('Mary',18,50,0)
print("姓名:{0},年龄:{1},体重:{2}".format(animal.name,animal.age,animal.weight))
print("男性" if animal.gender==1 else '女性')
print("姓名:{0},年龄:{1},体重:{2}".format(animal1.name,animal1.age,animal1.weight))
print("男性" if animal1.gender==1 else '女性')
代码运行结果
姓名:Tom,年龄:18,体重:66
男性
姓名:Mary,年龄:18,体重:50
女性
类变量
“类变量”是所有实例(或对象)共有的变量,需要在方法外定义,访问实例变量通过“实例名.实例变量名”的形式,而访问类变量“类名.类变量名”的形式访问。
示例代码如下
class Account:
interest_rate = 0.068 # 类变量
# 重写构造方法
def __init__(self,owner,amount):
self.owner = owner
self.amount = amount
account = Account('Tony',1_800_000.0)
# 查看实例变量
print('account实例所有变量:{0}'.format(account.__dict__))
# 为account.interest_rate变量赋值,此时无论类中是否有同名变量都会创建一个新的实例变量
account.interest_rate = 0.01
account.interest_rate2 = 0.01
print('账户名:{0}'.format(account.owner))
print('账号金额:{0}'.format(account.amount))
print('利率:{0}'.format(Account.interest_rate))
# 查看实例变量
print('account实例所有变量:{0}'.format(account.__dict__))
代码运行结果
account实例所有变量:{'owner': 'Tony', 'amount': 1800000.0}
账户名:Tony
账号金额:1800000.0
利率:0.068
account实例所有变量:{'owner': 'Tony', 'amount': 1800000.0, 'interest_rate': 0.01, 'interest_rate2': 0.01}
注意:不要通过实例存取类变量数据。当通过实例读取变量时,Python解释器会先在实例中找这个变量,如果没有再到类中去找;当通过实例为变量赋值时,无论类中是否有该同名变量,Python解释器都会创建一个同名实例变量。
构造方法
__init_()方法是构造方法,用来创建和初始化实例变量,定义时它的第一个参数应该是self,其后的参数才是用来初始化实例变量的;其中参数可以有默认值。调用构造方法时不需要传入self。如果未定义构造方法,则会自动调用默认的构造方法;一旦定义了构造方法,则不会调用默认的构造方法。
输入下面代码
class Animal(object):
# 构造方法
def __init__(self,name='mark',age=20,weight=120,gender=120):
self.name = name # 定义姓名实例变量
self.age= age # 定义年龄实例变量
self.weight = weight # 定义体重实例变量
self.gender =gender # 定义性别实例变量
animal0 = Animal() # 此时没有传入参数,参数为默认值
animal = Animal('Tom',18,66,1)
animal1 = Animal('Mary',18,50,0)
print("姓名:{0},年龄:{1},体重:{2}".format(animal0.name,animal0.age,animal0.weight))
print("