1.面向对象的常用概念
pyhton也是一门面向对象的语言,体现了其封装性,将要做的事情封装到对象里,用对象去完成,而不是每一个步骤都要我们去细分,可以先了解一下面向对象里面的常用概念:
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 方法:类中定义的函数。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。(python是可以多继承的)
- 实例化:创建一个类的实例,类的具体对象。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
2.类的定义
这是一个简单的类
3.对象的创建及其方法与属性的调用
创建对象的格式: 变量=classname( ) (如果有__init__()方法,方法里面有属性参数,那么在创建对象的时候括号里面就要加入参数)
示例:
4.添加对象的属性
除了上述在创建类的时候直接将属性作为类变量以外,我们还可以用下面的方法添加对象的属性
创建多个对象
5.对象的init方法和str方法
def __init__( self,*value) 此构造函数在类进行实例化的时候会自动进行调用
在init方法中加入参数,那么在创建对象的时候也要加入参数
def __str__(self)方法相当于java里面的tostring方法,有返回值,一般如果我们想直接打印对象就能看到其属性值,就会写上__str__()方法
没有str方法,打印对象就是其地址值
加上str方法后:
6.不同类间的相互影响 (示例)
class Home:
def __init__(self, new_area, new_info, new_addr):
self.area = new_area #面积
self.info = new_info #户型
self.addr = new_addr #地址
self.left_area = new_area #可用面积
self.contain_items = [] #家具
def __str__(self):
msg = "房子的总面积是:%d,可用面积是:%d,户型是:%s,地址是:%s"%(self.area, self.left_area, self.info, self.addr)
msg += " 当前房子里的物品有%s"%(str(self.contain_items))
return msg
def add_item(self, item):
self.left_area -= item.area
self.contain_items.append(item.name)
class furniture:
def __init__(self, new_name, new_area):
self.name = new_name
self.area = new_area
def __str__(self):
return "%s占用的面积是:%d"%(self.name, self.area)
house = Home(129, "三室两厅两卫", "武汉市江夏区光谷一路88号")
print(house)
print("第二次置办家具")
bed = furniture("席梦思", 4) #购买了一张床
print(bed)
#房子的可用面积要减小,放家具的集合要添加元素
house.add_item(bed)
print(house)
print("第二次置办家具")
desk = furniture("饭桌",2)
house.add_item(desk)
print(house)
输出的结果:
7.隐藏对象的属性
这种操作是考虑数据的安全性
隐藏属性的做法
8.私有属性和私有方法
私有变量:__fieldname
私有方法:def __say(self):
私有变量的取值和赋值:
私有方法的定义和调用
9.del方法
测量一个对象引用的个数
10.继承
python里面的继承可以是单继承也可以是多继承,继承就是将都会常用的属性及行为抽取到一个类里面,如果其它类也要用这些属性和行为直接继承该类,这样就会减少代码的书写,节省了开发时间,提高了代码的复用性和简洁性
单继承:class B(A):
多继承: class C(A,B):
示例演示:
class Anmail:
def eat(self):
print(".........吃..........")
def drink(self):
print(".........喝..........")
def sleep(self):
print(".........睡..........")
class Cat(Anmail):#单继承
def catch(self):
print(".........抓老鼠..........")
class People:
def say(self):
print(".........说话..........")
class Lanmao(Cat,People):#多继承
def catch(self): #与父类的方法相同,叫方法的覆盖或者是重写
print(".........机器猫不敢抓老鼠..........")
lanmao =Lanmao() #创建对象
lanmao.eat() # 父类的父类的方法
lanmao.say() #其中一个父类的方法
lanmao.catch() #父类和自己都有
输出的结果如下:
子类会继承它所有祖先类的方法
访问被重写的方法
(1)父类名.被重写方法名(self) 括号里面必须加上self
(2)super().被重写方法名() super后面的括号不要忘了
11.私有变量和私有方法在继承中的特性
子类无法直接访问子类的私有变量和私有方法
访问父类中的私有变量和方法的可能方式
12.多态
多态:向不同的对象发送同一条消息,不同的对象在接收时会产生不同的行为(即方法)。也就是说,每个对象可以用自己的方式去响应共同的消息。所谓消息,就是调用函数,不同的行为就是指不同的实现,即执行不同的函数。
作用:
(1)增加了程序的灵活性
以不变应万变,不论对象千变万化,使用者都是同一种形式去调用,如eat(item)
(2)增加了程序额可扩展性
通过继承animal类创建了一个新的类,使用者无需更改自己的代码,还是用eat(item)去调用
示例:
13.类属性和实例属性
类属性:属于类对象,被实例对象对象共享
实例属性:和某个实例有关系,实例与实例之间不共享,
14.实例方法、静态方法、类方法
类方法:在方法上面加上@classmethod注解
静态方法: 在方法上面加上@staticmethod注解