学习python第十五天,面向对象
2019-01-15 06:55 筑_梦 阅读(237) 评论(0) 编辑 收藏 举报Python从设计之初就已经是一门面向对象的语言,正因为如此,在Python中创建一个类和对象是很容易的。
面向对象技术简介
- 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量, 用于处理类及其实例对象的相关的数据。
- 方法重写:如果从父类继承的方法不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写。
- 局部变量:定义在方法中的变量,只作用于当前实例的类。
- 实例变量:在类的声明中,属性是用变量来表示的。这种变量就称为实例变量,是在类声明的内部但是在类的其他成员方法之外声明的。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟"是一个(is-a)"关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法。
实例
class Role: #定义类 Role 角色 n = 123 #类变量 n_list = []#类变量 name = "name"#类变量 def __init__(self, name, role, weapon, life_value=100, money=15000): #__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法,作用:在实例化时做一些类的初始化的工作 self.name = name #r1.name=name实例变量(静态属性),作用域就是实例本身 self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。 self.role = role# 角色 self.weapon = weapon #武器 self.__life_value = life_value #__变私有属性不允许外部修改 self.money = money def __del__(self):#析构函数 #在实例释放、销毁的时候自动执行的,通常用于做一些收尾工作, 如关闭一些数据库连接,关闭打开的临时文件 #可以做一些销毁尸体的事 pass #print("%s 彻底死了。。。。" %self.name) def show_status(self):## 类的方法,功能 (动态属性) print("name:%s weapon:%s life_val:%s" %(self.name, self.weapon, self.__life_value)) def shot(self): # 类的方法,功能 (动态属性) print("shooting...") def got_shot(self):# 类的方法,功能 (动态属性) 加__变私有方法 self.__life_value -=50 #生命值 print("%s:ah...,I got shot..."% self.name) def buy_gun(self, gun_name):# 类的方法,功能 (动态属性) print("%s just bought %s" % (self.name,gun_name) ) r1 = Role('James', 'police', 'AK47') # Role(r1,'James', 'police', 'AK47')把一个类变成一个具体对象的过程叫 实例化(初始化一个类,造了一个对象) r1.buy_gun("AK47") #访问属性买枪 r1.got_shot() #访问属性中枪 #del r1 # r1.__shot() #私有方法 print(r1.show_status()) #显示状态
类的继承
面向对象的编程带来的主要好处之一是代码的重用,实现这种重用的方法之一是通过继承机制。
通过继承创建的新类称为子类或派生类,被继承的类称为基类、父类或超类。
# class People: 经典类写法 class People(object): #新式类写法多继承 def __init__(self,name,age): self.name = name self.age = age self.friends = [] print("--doens't run ") def eat(self): print("%s is eating..." % self.name) def talk(self): print("%s is talking..." % self.name) def sleep(self): print("%s is sleeping..." % self.name) class Relation(object):#增加类 Relation关系 def __init__(self,n1,n2): print("init in relation") def make_friends(self,obj): #w1交朋友方法 print("%s is making friends with %s" % (self.name,obj.name)) self.friends.append(obj.name) class Man(People,Relation):#子类1 def __init__(self,name,age,money):#重构必须重写父类参数加其他参数 #People.__init__(self,name,age)# 调用父类方法 super(Man,self).__init__(name,age) #新式类写法 内置方法 self.money = money print("%s 一出生就有%s money" %(self.name,self.money)) def piao(self): print("%s is piaoing ..... 20s....done." % self.name) def sleep(self): People.sleep(self) print("man is sleeping ") class Woman(People,Relation):#子类2 def get_birth(self): print("%s is born a baby...." % self.name) m1 = Man("Jack",22,10) w1 = Woman("John",26) m1.make_friends(w1) w1.name = "小明" print(m1.friends[0])
在python中继承中的一些特点:
- 1、如果在子类中需要父类的构造方法就需要显示的调用父类的构造方法,或者不重写父类的构造方法。详细说明可查看
- 2、在调用基类的方法时,需要加上基类的类名前缀,且需要带上 self 参数变量。区别在于类中调用普通函数时并不需要带上 self 参数
- 3、Python 总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。(先在本类中查找调用的方法,找不到才去基类中找)
你可以使用issubclass()或者isinstance()方法来检测。
- issubclass() - 布尔函数判断一个类是另一个类的子类或者子孙类,语法:issubclass(sub,sup)
- isinstance(obj, Class) 布尔函数如果obj是Class类的实例对象或者是一个Class子类的实例对象则返回true。