一切皆对象!
预习:
#仿照正方形类写一个圆形类 class Square: def __init__(self,length_of_side): self.length_of_side = length_of_side def square(self): ‘面积‘ return self.length_of_side * self.length_of_side def perimeter(self): ‘周长‘ return self.length_of_side * 4 正方形 = Square(2) print(正方形.square()) print(正方形.perimeter())
预习题
一、面向过程-->面向对象
面向过程:根据业务逻辑从上到下堆叠代码
函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可
面向对象:对函数进行分类和封装,让开发“更快更好更强...”
二、初始类和对象
python中一切皆为对象,类型的本质就是类,所以你已经使用了很长时间的类了
在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个。
1、类
#定义一个人类 class类关键字和定义函数时的def同理 class Person: role = ‘person‘ #role变量 属性—— 静态属性 def walk(self): #self必须写(作用后面会介绍)方法,也叫动态属性 print("person is walking..."
类
属性引用(类名.属性)
class Person: role = ‘person‘ 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 # 每一个角色都有自己的昵称; 苍井井 = Person(‘苍井井‘) 小泽泽 = Person(‘小泽泽‘) #实例化的过程就是类——>对象的过程
实例化
类名()就等于在执行Person.__init__(),执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。
查看属性&调用方法
print(苍井井.name) #查看对象属性直接 对象名.属性名
self:在实例化时自动将对象/实例本身传给__init__的第参数,必须写可以有别名但不建议用别名
类补充
一:我们定义的类的属性到底存到哪里了?有两种方式查看 dir(类名):查出的是一个名字列表 类名.__dict__:查出的是一个字典,key为属性名,value为属性值 二:特殊的类属性 类名.__name__# 类的名字(字符串) 类名.__doc__# 类的文档字符串 类名.__base__# 类的第一个父类(在讲继承时会讲) 类名.__bases__# 类所有父类构成的元组(在讲继承时会讲) 类名.__dict__# 类的字典属性 类名.__module__# 类定义所在的模块 类名.__class__# 实例对应的类(仅新式类中)
类属性的补充
2、对象
我们来写一个人狗大战:现在我们需要对我们的类做出一点点改变。人类除了可以走路之外应该具备一些攻击技能
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 -= self.aggressivity print("{0}打了{1}一下,{1}剩余血量{2}".format(self.name, dog.name, dog.life_value))
人类
对象是关于类而实际存在的一个例子,即实例。对象/实例只有一种作用:属性引用
苍井井 = Person(‘苍井井‘,10,1000) print(苍井井.name) print(苍井井.aggressivity) print(苍井井.life_value)
你也可以引用一个方法,因为方法也是一个属性(动态属性)。
class 类名: 类属性 = None def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要传self,其他与init中的形参一一对应 #结果返回一个对象 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可 #对象增加属性 对象.新的属性名 = 1000
小结
对象之间的交互
既然我们要做人狗大战,我们已经有人了,现在我们要再创建一个狗类,狗咬人,我们给狗一个bite方法。有了狗类,我们再实例化一只实实在在的狗出来。人和狗就可以打架了。
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): # 狗可以咬人,这里的狗也是一个对象。 people.life_value -= self.aggressivity print("{0}咬了{1}一下,{1}剩余血量{2}".format(self.name,people.name,people.life_value))
狗类
实例化一只狼狗:
egon = Dog(‘egon‘,‘狼狗‘,100,20000) #创造了一只实实在在的狗egon
交互 苍井井 打了 egon 一下/egon 咬了 苍井井 一下
a = Person("苍井井",10,1000) b = Dog("egon","狼狗",100,20000) a.attack(b) b.bite(a)
交互
完整的人狗大战代码:
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 -= self.aggressivity print("{0}打了{1}一下,{1}剩余血量{2}".format(self.name, dog.name, dog.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): # 狗可以咬人,这里的狗也是一个对象。 people.life_value -= self.aggressivity print("{0}咬了{1}一下,{1}剩余血量{2}".format(self.name,people.name,people.life_value)) a = Person("苍井井",10,1000) b = Dog("egon","狼狗",200,20000) while True : a.attack(b) b.bite(a) if a.life_value <= 0 : print(a.name+"被"+b.name+"咬死了!") break if b.life_value <= 0 : print(b.name + "被" + a.name + "咬死了!") break
egon大战苍井井
三、类命名空间与对象、实例的命名空间
创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性
静态属性就是直接在类中定义的变量,动态属性就是定义在类中的方法
其中类的数据属性是共享给所有对象的
print(id(a.role)) print(id(Person.role)) #相同
而类的动态属性是绑定到所有对象的
print(a.attack) print(Person.attack) #不同
创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性,在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
四、面向对象的组合用法
组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合
class Weapon: ‘‘‘ 这是一个游戏里武器的数据类型 ‘‘‘ def __init__(self,name, price, aggrev, life_value): self.name = name #武器名称 self.price = price #武器价格 self.aggrev = aggrev #武器伤害加成 self.life_value = life_value #武器血量加成 def update(self, obj): #obj就是要带这个装备的人 obj.money -= self.price # 用这个武器的人花钱买所以对应的钱要减少 obj.aggressivity += self.aggrev # 带上这个装备可以让人增加攻击 obj.life_value += self.life_value # 带上这个装备可以让人增加生命值 def prick(self, obj): # 这是该装备的主动技能,绞龙 obj.life_value -= 3000 # 假设攻击力是3000
武器类
组合交互人狗大战完整代码:
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 -= self.aggressivity print("{0}打了{1}一下,{1}剩余血量{2}".format(self.name, dog.name, dog.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): # 狗可以咬人,这里的狗也是一个对象。 people.life_value -= self.aggressivity print("{0}咬了{1}一下,{1}剩余血量{2}".format(self.name,people.name,people.life_value)) class Weapon: ‘‘‘ 这是一个游戏里武器的数据类型 ‘‘‘ def __init__(self,name, price, aggrev, life_value): self.name = name #武器名称 self.price = price #武器价格 self.aggrev = aggrev #武器伤害加成 self.life_value = life_value #武器血量加成 def update(self, obj): #obj就是要带这个装备的人 obj.money -= self.price # 用这个武器的人花钱买所以对应的钱要减少 obj.aggressivity += self.aggrev # 带上这个装备可以让人增加攻击 obj.life_value += self.life_value # 带上这个装备可以让人增加生命值 def prick(self, obj): # 这是该装备的主动技能,绞龙 obj.life_value -= 3000 # 假设攻击力是3000 print("{0}发动主动技:蛟龙==>{1}剩余血量{2}".format(self.name, obj.name, obj.life_value)) a = Person("苍井井",10,1000) b = Dog("egon","狼狗",200,20000) c = Weapon("蛟龙鞭",1000,40,2000) a.money = 2000 #判断是否买的起武器 if a.money > c.price : c.update(a) a.weapon = c #大战开始 while True : a.attack(b) if b.life_value <= 0 : print(b.name + "被" + a.name + "打死了!") break a.weapon.prick(b) if b.life_value <= 0 : print(b.name + "被" + a.name + "绞死了!") break b.bite(a) if a.life_value <= 0 : print(a.name+"被"+b.name+"咬死了!") break
egon大战苍井井升级版
思维导图:
预习答案:
#圆形类 class Circle: def __init__(self,radius): self.radius = radius def area(self): ‘面积‘ return self.radius **2 * 3.14 def perimeter(self): ‘周长‘ return self.radius * 2 *3.14 圆 = Circle(8) print(圆.area()) print(圆.perimeter())
预习答案