目录
面向对象编程的三大特征:封装、继承、多态;
1. 定义类
语法格式:
# 语法格式:
class 类名:
执行语句...
类变量...
方法...
类名:一个或者多个单词连接而成,每个单词首字母大写,其余字母全部小写,单词与单词之间不使用分隔符;
类包含的类变量可以动态增加或删除,程序在类定义中为新变量赋值就是增加类变量,程序可以在任何地方为已有的类增加变量,也可以通过del语句删除已有类的类变量;
对象的变量也可以动态增加或删除,只要对对象的新变量赋值就是增加变量,可通过del语句删除已有对象的变量;
定义方法与定义函数相同,但类中的方法第一个参数要定义为self,用于自动指向调用该方法的对象;
特殊的方法:__init__,这个方法叫做构造方法,用于构造该类的对象,Python通过调用构造方法生成对象;如果开发者没有定义构造方法,Python会自动为该类定义一个只包含self参数的默认的构造方法;
2. 创建与使用对象(对象也称为实例)
语法格式:
对象变量 = 类名()
# 本质是调用类里面的构造方法创建对象
对象访问方法或者变量的语法格式: 对象.变量|方法(参数)
class Dog:
def __init__(self, sex="公", classification="二哈"):
# 为Dog对象定义了两个实例变量,self表示调用该函数的对象,self.变量就是实例变量
self.sex = sex
self.classification = classification
# 创建对象的本质是根据构造函数创建对象,所以参数值要与构造函数的参数相匹配
# 如果不传入参数,因为有默认参数值,对象将按照默认参数值创建
# 如果没有默认参数值,并且创建对象不传入参数值,程序将出现错误
my_dog_1 = Dog()
print(my_dog_1.sex, my_dog_1.classification)
# 公 二哈
my_dog_2 = Dog("母", "斗牛犬")
print(my_dog_2.sex, my_dog_2.classification)
# 母 斗牛犬
1)增加或删除实例变量
增加实例变量:为新变量赋值即可;
删除实例变量:del语句;
my_dog_2.name = "林林"
print(my_dog_2.name)
# 林林
del my_dog_2.sex
print(my_dog_2.sex)
# 程序错误:AttributeError: 'Dog' object has no attribute 'sex'
2)增加实例方法
!!!为对象动态增加的方法,python不会自动将第一个参数self指向调用的对象;
# 先定义一个函数
def feed_food(self, type):
if type=="breakfast":
print("1号类型狗粮")
elif type=="lunch":
print("2号类型狗粮")
else:
print("3号类型狗粮")
# 使用函数feed_food对对象my_dog_2的方法food赋值
my_dog_2.food = feed_food
# 手动指定self参数为调用者
my_dog_2.food(my_dog_2, "lunch")
# 2号类型狗粮
使用MethodType可以将动态增加的方法设置为自动将第一个参数指向调用者:可以看到调用该方法时不需要指定第一个参数为调用者了;
from types import MethodType
my_dog_2.food = MethodType(feed_food, my_dog_2)
my_dog_2.food("lunch")
# 2号类型狗粮
当Python对象的一个方法调用其他方法时,不可以省略self;
class Dog:
def __init__(self, sex="公", classification="二哈"):
# 为Dog对象定义了三个实例变量
self.sex = sex
self.classification = classification
self.health = 1
def is_dog_healthy(self):
if self.health == 1:
return True
else:
return False
def feed_food(self, type):
# 该方法调用其他方法self不能省略
if self.is_dog_healthy()==False:
print("狗狗得病了需要吃好的")
elif type == "breakfast":
print("1号类型狗粮")
elif type == "lunch" :
print("2号类型狗粮")
else:
print("3号类型狗粮")