一切皆对象!

预习:

#仿照正方形类写一个圆形类
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):初始面向对象的更多相关文章

  1. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  2. Python进阶(十五)----面向对象之~继承(单继承,多继承MRO算法)

    Python进阶(十五)----面向对象之~继承 一丶面向对象的三大特性:封装,继承,多态 二丶什么是继承 # 什么是继承 # b 继承 a ,b是a的子类 派生类 , a是b的超类 基类 父类 # ...

  3. Python进阶学习之面向对象

    目录 面向对象 私有属性 面向对象   python也有面向对象的编程,它与C++中的类有点相似.它也只是运算符重载,继承. class Test: num=0 def __init__(self): ...

  4. Python进阶 函数式编程和面向对象编程等

    函数式编程 函数:function 函数式:functional,一种编程范式.函数式编程是一种抽象计算机的编程模式. 函数!= 函数式(如计算!=计算机) 如下是不同语言的抽象 层次不同 高阶函数: ...

  5. Python进阶之面向对象编程

    面向对象编程——Object Oriented Programming,简称OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程序设计把计算机 ...

  6. python进阶01 面向对象、类、实例、属性封装、实例方法

    python进阶01 面向对象.类.实例.属性封装.实例方法 一.面向对象 1.什么是对象 #一切皆对象,可以简单地将“对象”理解为“某个东西” #“对象”之所以称之为对象,是因为它具有属于它自己的“ ...

  7. Python进阶(十三)----面向对象

    Python进阶(十三)----面向对象 一丶面向过程编程vs函数式编程vs面向对象编程 面向过程: ​ 简而言之,step by step 一步一步完成功能,就是分析出解决问题所需要的步骤,然后用函 ...

  8. python进阶_浅谈面向对象进阶

    python进阶_浅谈面向对象进阶 学了面向对象三大特性继承,多态,封装.今天我们看看面向对象的一些进阶内容,反射和一些类的内置函数. 一.isinstance和issubclass  class F ...

  9. Python进阶之函数式编程

    函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...

  10. python进阶强化学习

    最近学习了慕课的python进阶强化训练,将学习的内容记录到这里,同时也增加了很多相关知识. 主要分为以下九个模块: 基本使用 迭代器和生成器 字符串 文件IO操作 自定义类和类的继承 函数装饰器和类 ...

随机推荐

  1. Linux中的apache的服务命令

    1. 启动apachesudo service httpd start 2. 停止服务apachesudo service httpd stop 3. 重新启动apachesudo service h ...

  2. Log4j中配置日志文件相对路径

    方法一. 解决的办法自然是用相对路径代替绝对路径,其实log4j的FileAppender本身就有这样的机制,如:log4j.appender.logfile.File=${WORKDIR}/logs ...

  3. Redis 内存管理与事件处理

    1 Redis内存管理 Redis内存管理相关文件为zmalloc.c/zmalloc.h,其只是对C中内存管理函数做了简单的封装,屏蔽了底层平台的差异,并增加了内存使用情况统计的功能. void * ...

  4. CSS3学习系列之背景相关样式(二)

    在border-radius属性中指定两个半径 在border-radius属性中,可以指定两个半径,指定方法如下所示: border-radius:40px 20px; 针对这种情况,各种浏览器的处 ...

  5. 一个Ruby静态代码分析器 rubocop

    A Ruby static code analyzer, based on the community Ruby style guide. http://rubocop.readthedocs.io ...

  6. UGUI 字体背景长度自适应

    本文实现以下需求: 在UGUI中 Text为动态添加 要使Text字体背景随着Text的长度而变化 之前还在赞叹UGUI的强大 转念一想,UGUI中好像没有可以实现此功能的组件 也想出了一种办法 把背 ...

  7. 64位win7安装jdk和eclipse

    本人正确安装成功步骤,对他人可能无用: 1.直接拷以前32位eclipse ADT 2.安装32位的jdk:jdk-8u45-windows-i586 3.ok,所有环境变量无需手工设置 eclips ...

  8. Python爬虫从入门到放弃(十五)之 Scrapy框架中Spiders用法

    Spider类定义了如何爬去某个网站,包括爬取的动作以及如何从网页内容中提取结构化的数据,总的来说spider就是定义爬取的动作以及分析某个网页 工作流程分析 以初始的URL初始化Request,并设 ...

  9. java 使用spring实现读写分离

    最近上线的项目中数据库数据已经临近饱和,最大的一张表数据已经接近3000W,百万数据的表也有几张,项目要求读数据(select)时间不能超过0.05秒,但实际情况已经不符合要求,explain建立索引 ...

  10. AndroidDemo - FloatWindowDemo

    安卓悬浮窗Demo 在桌面上创建一个小的悬浮窗.点击小悬浮窗后会弹出一个大的窗口.大窗口上有2个按键,分别为返回与关闭.点击大窗口外的部分能返回小窗口. 小窗口可以自由拖动.小窗口上显示的是当前内存使 ...