在此之前学习的编程方式均称为面向过程,过程类似于函数,只能执行,没有返回值
面向过程和面向对象
面向过程-->怎么做?
面向对象-->谁来做?
相比函数,面向对象 是更大的封装,根据职责在一个对象中封装多个方法
面向对象的三大特性:
封装:根据职责将属性和方法封装到一个抽象的类中
继承:实现代码的重用,相同的代码不需要重复编写
多态:不同的对象调用相同的方法,产生不同的执行结果,增加代码的灵活性
类和对象
定义:
类是一群具有相同特征(即属性)或者行为(即方法)的事物的一个统称,是抽象的,不能直接使用
对象 是有类创建出来的一个具体的存在,可以直接使用
由哪一个类创建出来的对象,就拥有在哪一个类中定义属性和方法
类与对象的关系:
- 在程序开发中,先有类,在有对象
- 类只有一个,对象可以有很多个。在内存的保存地址是不一样
- 不同对象之间属性可能会不相同
- 类中定义了什么属性和方法,对象中就有什么属性和方法,不可能多也不可能少
打个比方:类就像是创建飞机的图纸,不能飞,就是一个模板,对象就是根据图纸制造出来的飞机
类的设计
三要素:
类名:一类事物的名称,满足大驼峰命名法(每一个首字母都是大写,单词与单次之间没有下划线)
属性:这类事物有什么特征
方法:这类事物有什么行为
dir内置函数(科普)
作用:使用内置函数dir传入标识符或数据。可以查看对象内所有属性和方法
在Python中,看到格式为 __方法名__ 就是Python提供的内置方法/属性
查看方式:进入ipython 输入dir("abc")
定义类
格式:
class 类名: def 方法1(self,参数列表): pass def 方法2(self,参数列表): pass
创建对象
当一个类定义完成后,需要使用这个类来创建对象
语法格式:
对象变量 = 类名 ()
对象在内存中存储的地址用十六进制表示
方法中self参数
给对象增加属性:对象.属性名 利用赋值语句就可以
利用self在类封装的方法可以输出输出属性值
由哪一个对象调用的方法,方法内部的self就是哪一个对象的引用
# 需求:小猫爱吃鱼,小猫要喝水
定义一个猫类 cat
定义两个方法 eat 和drink
按照需求不需要定义属性
# 创建类 class Cat: def eat(self): print ( "小猫爱吃鱼" ) def drink(self): print ( "%s 爱喝水,年龄是 %d" % (self.name, self.age) ) --》这种方法一般不推荐 # 创建对象 tom = Cat () amy = Cat () tom.age = 2 tom.name = "大懒猫" tom.drink ()
对象初始化方法
当时用类名() 创建对象时,会自动执行一下操作:
- 为对象在内存中分类空间----创建对象
- 为对象的属性设置初始值----初始化方法(init)
class Cat:
def __init__(self):
print("这是一个初始化方法")
self.name=“大懒猫”
tom=Cat()
与上述练习的例子相比,如果上述代码不写tom.drink() 是没有输出的,对比下面创建了对象就会有输出
在初始化方法中定义属性
使用方式: self.属性名=属性的初始值,如上self.name=“大懒猫”
使用参数设置属性的初始值
class Cat:
def __init__(self,name):
self.name = name #在方法内部使用self.name=形参 接收外部传递的参数
def eat(self):
print("%s 爱吃鱼" % self.name)
tom=Cat("大懒猫") #在创建对象时,使用类名(属性1,属性2...)调用
tom.eat()
del方法和对象的声明周期
当一个对象从使用一个 类名( ) 创建,对象的生命周期开始
一个对象的 __del__ 方法,一旦被调用,生命周期结束
在对象的生命周期内,可以访问对象的属性,或者对象调用方法
__str__方法
__str__方法必须返回一个字符串
利用该方法可以打印自定义内容
如果没有__str__方法,针对上述的例子中 print(tom)打印对象输出的信息如下:
<__main__.Cat object at 0x01E51330>
所以在__str__方法中必须要有返回的字符串信息
格式如下:
class Person (): def __init__(self, name, weight): self.name = name self.weight = weight def __str__(self): return "我的名字叫 %s,体重是 %.2f 公斤" % (self.name, self.weight)
注意:在init方法中定义的变量在后续的方法中均可以调用