面向对象技术简介
- 类(Class):用来描述具有相同的属性和方法的对象的集合,它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
- 类变量:类变量在整个实例化的对象中是公用的,类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。
- 数据成员:类变量或者实例变量用于处理类及其实例对象的相关数据。
- 方法重写:吐过从父类继承的方法不能满足子类的需求,可以对其进行改写,这锅过程叫发放的颠覆(override),也称为方法的重写。
- 实例变量:定义在方法中的变量,只作用与当前的实例的类。
- 继承:即一个派生类(derived class)继承基类(base class)的字段和方法,继承也许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这事模拟是一个(is-a)'关系(例图,Dog是一个Animal)。
- 实例化:创建一个类的实例,类的具体对象。
- 方法:类中定义的函数。
- 对象:通过类定义的数据结构实例,对象包括两个数据成员(类变量和实例变量)和方法。
类的定义:
语法格式如下:
''' class 类名: '类的文档字符串' 类体 ''' #我们创建一个类 class Data: pass
类的两种作用:属性引用和实例化
属性引的语法(类名.属性)
class Person: #定义一个类(人类),类名的首字母必须为大写 role = '中国人' #人的角色属性都是人 def walk(self): #人都可以走路,也就是有一个走路方法 print('person is walking...') print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意这里不是在调用
实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例来定制自己的特征
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def __init__(self,name): self.name = name #每一个角色都有自己的昵称 def walk(self): #人都可以走路,也就是有一个走路的方法 print('person is walking...') print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意这里不是在调用
实例化的过程就是累——>对象的过程
原本我们只有一个Person类,在这个过程中产生了一个egg对象,有自己具体的名字、攻击力、生命值。
语法如下:对象名 = 类名(参数)
egg = Person('egon') #类名()就等于在执行Person.__init__() #执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。 #你可以偷偷的理解:egg = {'name':'egon','walk':walk}
查看属性&调用发放
print(egg.name) #查看属性值:对象名、属性名 print(egg.walk()) #调用方法:对象名.方法名()
关于self
self是实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给它起个别名,但是不建议更改。
类属性的补充:
# 一、我们定义的类的属性到底存到哪里了?有以下两种发放查看 # dir(类名): #查出的是一个名字列表 # 类名.__dict__: #查出的是一个字典,key为属性名,value为属性值 # # 二、特殊的类属性 # 类名.__name__ #类的名字(字符串) # 类名.__doc__ #类的文档字符串 # 类名.__base__ #类的第一个父类(在讲继承时会讲) # 类名.__bases__ #类的所有父类构成的元祖(在讲 # 类名.__dict__ #类的字典属性 # 类名.__module__ #类定义所在的模块 # 类名.__class__ #实例对应的类(仅新式类中)
对象的相关知识
继续人狗大战,现在我们需要对我们的类做出一点点改变,人类除了可以走路之外,还应该具备一些攻击技能。
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def __init__(self,name,aggressivity,life_value): self.name = name #每一个角色都有自己的昵称 self.aggressivity = aggressivity #给角色增加攻击力 self.life_value = life_value #给角色增加生命值 def attack(self,dog): '''人可以攻击狗,这里的狗也是一个对象。 人攻击狗,那么狗的生命值就会根据人的攻击力而下降''' dog.life_value =dog.life_value - self.aggressivity #等同于dog.life_value -= dog.aggressivity # 对象是关于类而实际存在的一个例子,即实例 # 对象/属性只有一种作用:属性引用 egg = Person('egon',50,1000) #指定人物,攻击力,生命值并且复制给到egg对象 print(egg.name) #输出人物昵称 print(egg.aggressivity) #输出人物攻击力 print(egg.life_value) #输出人物生命值
当然也可以引用一个方法,因为方法也是一个属性,只不过是一个类似函数的属性,我们也管它叫动态属性。引用动态属性并不是执行这个方法,要想调用方法和调用函数是一样的,都需要在后面加上括号。
print(egg.attack)
面向对象小结--定义及调用的固定模式
class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 #类名():类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要self,其它与init中的形参--对应 #结果返回一个对象 对象名.对象属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
对象之间的交互
现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人。现在我们要再创建一个狗类,所以我们要给狗一个bite方法有了狗类,我们还要实例化一只实实在在的狗出来,然后人和狗就可以打架了。
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def __init__(self,name,aggressivity,life_value): self.name = name #每一个角色都有自己的昵称 self.aggressivity = aggressivity #给角色增加攻击力 self.life_value = life_value #给角色增加生命值 def attack(self,dog): '''人可以攻击狗,这里的狗也是一个对象。 人攻击狗,那么狗的生命值就会根据人的攻击力而下降''' self.life_value -= self.aggressivity #等同于dog.life_value -= dog.aggressivity # 对象是关于类而实际存在的一个例子,即实例 # 对象/属性只有一种作用:属性引用 egg = Person('egon',50,800) #指定人物,攻击力,生命值并且复制给到egg对象 print('玩家的名称:',egg.name) #输出人物昵称 print('玩家攻击力:',egg.aggressivity) #输出人物攻击力 print('玩家生命值:',egg.life_value) #输出人物生命值 class Dog: role = 'dog' def __init__(self,name,breed,aggressivity,life_value): self.name = name self.breed = breed self.aggressivity = aggressivity self.life_value = life_value def bite(self,people): '''狗可以咬人,这里的狗也是一个对象 狗咬人,那么人的生命值就会根据狗的攻击力而下降''' self.life_value -= self.aggressivity ha2 = Dog('sunny','Hatchie ',200,800) #创造了一只实实在在的狗 print('动物的名字:',ha2.name) print('动物的品种:',ha2.breed) print('动物的攻击力:',ha2.aggressivity) print('动物的生命值:',ha2.life_value) print('旺财被玩家打之前的生命值:',egg.life_value) egg.attack(ha2) print('旺财被玩家打之后的生命值:',egg.life_value) print('玩家被旺财咬之前的生命值:',ha2.life_value) ha2.bite(egg) print('玩家被旺财咬之后的生命值:',ha2.life_value)