敲黑板,本章内容属于重要内容
1.面向对象
面向对象是一种编程思想,是将现实世界中的事物抽象为计算机世界中信息的方法。
举个栗子:
现实世界的人,有属性,性别、年龄、身高、体重、会两条腿走路、吃饭、如厕...等等。
我们要管理上亿人口,怎么办?人就是一个类,有性别,年龄,还有重要的身份编码等等。具体的你,我,它,张三,王五,赵六就是“对象”,他们是“人”这个类的具体个体,也叫“实例”。
再举个栗子:狗狗
2.定义类
Python中的数据类型都是类,当然,类也可以我们自己定义。
语法:
class 类名(父类):
#类体
命名的类继承父类, 让我们想一下狗狗这个类,它们有名字,还有年龄,大多数能做出蹲下和打滚的行为,考虑name和age两种属性,还有sit和roll_over两种行为:
#创建狗狗这个类
class Dog():
def __init__(self,name,age): #int前后都有两个下划线
#初始化name和age
self.name = name
self.age = age
def sit(self):
#小狗蹲下
print( "{}在蹲下.".format(self.name)) #通过"对象.实例变量"形式访问
def roll_over(self):
#小狗打滚
print("{}在打滚.".format(self.name) )
d = Dog("蛋蛋",3)
print("{0}是我们家的成员,它{1}岁了。".format(d.name,d.age))
d.sit()
d.roll_over() #调用"对象.实例方法"形式,无需传递参数
运行结果自己可以运行下看看。
(1)__int__()
类中的函数称为方法,__int__()是一个特殊的方法,用来初始化实例变量,每当创建Dog类的实例时,都要给两个形参赋值(name和age)。
以self为前缀的变量都可供类中所有方法使用,self.name = name
实例方法与实例变量一样,都是实例特有的方法。
(2)类变量
类变量是属于类的变量,不属于单个对象。就是说名字和年龄所有狗狗都有,但狗狗的名字和年龄都不一样,而蹲下和打滚这两个行为都是一样的,或者吃饭这个行为也都一样,吃饭就是实例共享的变量,它属于类,被称为“类变量”。而名字和年龄属于实例变量。
#创建狗狗这个类
class Dog():
eat = "在吃饭" #类变量eat
def __init__(self,name,age): #int前后都有两个下划线
#初始化name和age
self.name = name #创建和初始化实例变量
self.age = age #创建和初始化实例变量
def sit(self):
#小狗蹲下
print( "{}在蹲下.".format(self.name))#通过"对象.实例变量"形式访问
def roll_over(self):
#小狗打滚
print("{}在打滚.".format(self.name) )
d = Dog("蛋蛋",3)
print("{0}是我们家的成员,它{1}岁了。".format(d.name,d.age))
d.sit() #实例变量通过"对象.实例变量"形式访问
d.roll_over()
print("{0}{1}".format(d.name,Dog.eat)) #类变量通过"类名.类变量"形式访问
运行结果:
===== RESTART: C:/Users/Python/Python39/10.Dog类.py =======================
蛋蛋是我们家的成员,它3岁了。
蛋蛋在蹲下.
蛋蛋在打滚.
蛋蛋在吃饭
(3)类方法
类方法与类变量类似,属于类,不属于个体实例。在定义类方法时,它的第1个参数不是self,而是类本身。
@classmethod #定义类方法需要装饰器,装饰器以@开头
def <方法名>(cls,<参数>):#cls代表类自身,即class类名
return cls.<方法名> * <参数>
调用时,可以使用类替换 cls.<方法名>*<参数> 可以用 <类名>.<方法名>*<参数>替换。
这部分已经有点不好理解了,需要结合应用场景,最重要的还是多练,练中加深理解。
有空再介绍面向对象的重要特性,分别是封装性、继承性、多态性。