python进阶(4):初始面向对象
一切皆对象!
预习:
#仿照正方形类写一个圆形类
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())
预习答案
python进阶(4):初始面向对象的更多相关文章
- Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)
Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装: 将一些东西封装到一个地方,你还可以取出来( ...
- Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)
Python进阶(十五)----面向对象之~继承 一丶面向对象的三大特性:封装,继承,多态 二丶什么是继承 # 什么是继承 # b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类 # ...
- Python进阶学习之面向对象
目录 面向对象 私有属性 面向对象 python也有面向对象的编程,它与C++中的类有点相似.它也只是运算符重载,继承. class Test: num=0 def __init__(self): ...
- Python进阶 函数式编程和面向对象编程等
函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数: ...
- Python进阶之面向对象编程
面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...
- python进阶01 面向对象、类、实例、属性封装、实例方法
python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...
- Python进阶(十三)----面向对象
Python进阶(十三)----面向对象 一丶面向过程编程vs函数式编程vs面向对象编程 面向过程: 简而言之,step by step 一步一步完成功能,就是分析出解决问题所需要的步骤,然后用函 ...
- python进阶_浅谈面向对象进阶
python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass class F ...
- Python进阶之函数式编程
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- python进阶强化学习
最近学习了慕课的python进阶强化训练,将学习的内容记录到这里,同时也增加了很多相关知识. 主要分为以下九个模块: 基本使用 迭代器和生成器 字符串 文件IO操作 自定义类和类的继承 函数装饰器和类 ...
随机推荐
- LinkedList原理及源码解析
简介 LinkedList是一个双向线性链表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer).由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度, ...
- Apache+Tomcat实现动静分离
完成Tomcat集群搭建后,我们只需修改两.三处即可实现动静分离. 1.将原来httpd.conf中JkMount的路由规则都放入conf/extra/httpd-urimap.conf中: /*=l ...
- VB6之写注册表
难免会遇到写注册表的情况,写了个实用点的RegWrite函数.为了减少代码量,用WScript.Shell取代了API来实现. 使用方式就在注释中了,就不再过多解释了.PS:注释比实现代码要丰富多了, ...
- vue.js实现内部自定义指令和全局自定义指令------directive
在Vue中,我们平时数据驱动视图时候,内部自带的指令有时候解决不了一些需求,这时候,Vue给我们一个很好用的东东 directive 这个单词是我们写自定义指令的关键字哦 之定义指令为我们提供了几个钩 ...
- Postgresql快速写入/读取大量数据(.net)
环境及测试 使用.net驱动npgsql连接post数据库.配置:win10 x64, i5-4590, 16G DDR3, SSD 850EVO. postgresql 9.6.3,数据库与数据都安 ...
- 详解equals()方法和hashCode()方法
前言 Java的基类Object提供了一些方法,其中equals()方法用于判断两个对象是否相等,hashCode()方法用于计算对象的哈希码.equals()和hashCode()都不是final方 ...
- 你应该知道的git高级技巧
1.cherry-pick,把某个分支已经提交的commit放到另一个分支上 git cherry-pick <commit_id> 该命令可以将某个分支的提交记录合并到当前分支,如在ma ...
- js获取客户端MAC地址
最近遇到一个需求,医院要求呼叫中心账号必须对应MAC地址,也就是说该MAC地址必须和呼叫中心账号对应才可使用,这可就难道我了,这需求就要求每次都判断用户登录的电脑MAC地址是否有呼叫中心账号,当然只针 ...
- Centos 6.5开启rsync同步
一.测试环境 操作系统:Centos6.5 Server1:172.18.11.100 源服务器 Server2:172.18.11.110 目标服务器 二.操作步骤: 1.先 ...
- jvm学习002 虚拟机类加载过程以及主动引用和被动引用
虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制. 类从被加载到虚拟机内存中开始,到卸载出内存为 ...