python学习,day5:面向对象
面向对象介绍
世界万物,皆可分类
世间万物,皆为对象
只要是对象,就肯定属于某种品类
只要是对象,就肯定有属性
例子:
人:思考,说话,吃喝拉撒。
特性:
class类
一个类及时对一类拥有相同属性的抽象、蓝图、原型。在类中定义了这些对象的都具有的属性(variables(data)),共同方法
object对象
一个对象即是一个类的实例化后实例,一个类必须经过实例化后方可在程序中调用,一个类可以实例化多个对象,每个对象亦可以有不同的属性,就像人类是指所有人,每个人是指具体的对象,人与人之间有共性,亦有不同。
封装
在类中对数据的赋值,内部调用外部用户是透明的,这使类变成了一个胶囊或器官,里面包含着累的数据和方法。
继承
一个类可以派生出子类,在这个父类里定义的属性,方法自动被子类继承
多态
一个接口,多种实现
语法:
属性
方法
构造函数
析构函数
在实例释放、销毁的释藏执行的,通常用于做一些收尾工作,
私有方法,私有属性
类变量
类变量的用途,大家共用的属性,节省开销
class Person:
cn = '中国'
def __init__(self,name,age,addr,cn = 'china')
self.name =name
self.cn =cn
p1 =Person(name,age,addr)
实例变量
# coding=utf-8 # Author: RyAn Bi class Dog: #定义类 def __init__(self,name): #构造函数,在实例化时做一些初始化的工作 self.name =name def bulk(self): print('%s is a dog'%self.name) d1= Dog('a') #实例化(初始化一个类,造了一个对象) d2 = Dog('b') d3 = Dog('c') d1.bulk() d2.bulk() d3.bulk()
下面模拟了一个CS游戏的代码,看备注
# coding=utf-8 # Author: RyAn Bi class Role: n = 123 #类变量 n_list = [] #定义一个类变量,列表格式 name = '我是类name' def __init__(self,name,role,weapon,life_value=100,money=15000,): #构造函数 #在实例化时做一些类的初始化的工作 self.name = name #实例变量(静态属性),作用域就是实力本身 self.role = role self.weapon = weapon self.__life_value = life_value #私有属性,只能在内部访问 self.money = money def __del__(self): #最后执行,析构函数,对象结束和消失或者删除或者程序退出的时候执行。 print('%s is deaded..'%self.name) def shot(self): #类的方法,功能(动态属性) print('shooting!!!!') def __shot1(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)) def show_status(self): #定义一个函数,可以调用私有属性 print('name:%s weapon:%s life:%s:'%(self.name,self.weapon,self.__life_value)) r1 = Role('Alex','Police','AK47') #生成一个角色,把一个类变成一个具体对象的过程,叫实例化 r2 = Role('Jack','Terrioist','UZI') #生成一个角色,把一个类变成一个具体对象的过程,叫实例化 r1.got_shot() r1.buy_gun('uzi') r1.name = 'bb' #添加一个实例变量,会覆盖以前的 r1.bullet_prove = True #添加了一个之前没有的实例变量,是可以添加的 #del r1.weapon #可以删除实例变量 r1.n = '改类变量' #可以改r1的类变量(实际上是创造了一个实例变量),但r2不改变 print('r1:',r1.n,r1.name,r1.bullet_prove) #n是类变量,是123,虽然类变量也有name,但是实例本身的name优先级更高 print('r2:',r2.n,r2.name) #r2.n不变,因为前面只是改变了r1的n,属于实例变量 print(Role.n) Role.n = 'abc' print(r1.n,r2.n) #r1.n,仍然是实例变量优先,但r2.n是改变的,因为没有实例变量 r1.n_list.append('from r1') r2.n_list.append('from r2') print(r2.n_list) #n_list 共用内存地址,所以列表是改谁都全改 print(r2.money,r2.weapon) #r1.weapon 已经删除 #print(r1.__life_vaule) #私有属性,不能直接调用,会报错 print(r1.show_status()) #私有属性,只有定义才能看见