一、面向过程VS面向对象

面向过程:

     优点:极大的降低了写程序的复杂度,只需要顺着执行的步骤,堆叠代码即可。

     缺点:一套流水线或者流程就是来解决一个问题,代码就是牵一发而动全身

面向对象:

   优点:   解决了程序的扩展性,对某一个对象单独修改,会立刻反映到整个体系中如对游戏中

              一个人物参数的特征和技能修改都很容易。

  缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,

           面向对象的程序一旦开始就由对象之间的交互解决问题即便是上帝也无法预测最终结果。

         于是我们经常看到一个游戏人某一参数的修改极有可能导致阴霸的技能出现,一刀砍死3个人,

        这个游戏就失去平衡

类:具有相同特征的一类事物(人、狗、老虎)

对象/实例:具体的某一个事物(隔壁阿花、楼下旺财)

实例化:类——>对象的过程

二、初识类和对象:

>>> dict #类型dict就是类dict
<class 'dict'>
>>> d=dict(name='eva') #实例化
>>> d.pop('name') #向d发一条消息,执行d的方法pop
'eva'

     在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,

     对象是则是这一类事物中具体的一个。

三、类的相关知识:

初识类

声明:

def functionName(args):
'函数文档字符串'
函数体

声明函数

'''
class 类名:
'类的文档字符串'
类体
''' #我们创建一个类
class Data:
pass

声明类

class Person:   #定义一个人类
role = 'person' #人的角色属性都是人
def walk(self): #人都可以走路,也就是有一个走路方法,也叫动态属性
print("person is walking...")
class 类名:
类属性 = None
def __init__(self,对象属性):
self.对象属性 = 对象属性 def 方法名(self):
pass 实例 = 类名(10)
实例.方法名()

类有两种作用:属性引用和实例化

属性引用(类名.属性)

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 # 每一个角色都有自己的昵称; def walk(self): #人都可以走路,也就是有一个走路方法
print("person is walking...") print(Person.role) #查看人的role属性
print(Person.walk) #引用人的走路方法,注意,这里不是在调用
类名
类名.类属性
类名.方法名 实例 = 类名(参数,参数) #实例就是对象 实例
实例.方法名()
实例.对象属性 实例增加属性
实例.新的属性名 = 1000
print(实例.新的属性名)

关于self

self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字.


对象/实例只有一种作用:属性引用

egg = Person('egon',10,1000)
print(egg.name)
print(egg.aggressivity)
print(egg.life_value)
class 类名:
def __init__(self,参数1,参数2):
self.对象的属性1 = 参数1
self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西
#类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
#括号里传参数,参数不需要传self,其他与init中的形参一一对应
#结果返回一个对象
对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
class Person:
'''
这是一个游戏里人物的数据类型
'''
role = '中国人' #类属性—— 静态属性
def __init__(self,name,life_value,aggr):
self.name = name #名字 #对象属性
self.life_value = life_value #生命值 对象属性
self.aggr = aggr #攻击力 对象属性
def attack(self,enemy): #攻击方法——动态属性
enemy.life_value = enemy.life_value - self.aggr
print(Person.__doc__)
class Dog:
def __init__(self,name,breed,aggr,life_value):
self.nickname = name #昵称
self.breed = breed #品种
self.aggr = aggr #攻击力
self.life_value = life_value #生命值
def bite(self,person): #咬
person.life_value = person.life_value - self.aggr egg = Person('egon',1000,50)
alex = Person('alex',250,5)
旺财 = Dog('二愣子','牛头梗',30,20000) egg.money = 200
print(egg.money) class Weapon: #武器类
def __init__(self,name,aggr,life_value,price,attack_force):
self.price = price
self.name = name
self.aggr = aggr #伤害加成
self.life_value = life_value #生命加成
self.attack_force = attack_force #攻击力
def update(self,person): #带装备,人
person.money = person.money - self.price
person.aggr = person.aggr + self.aggr
person.life_value = person.life_value + self.life_value
def kill(self,obj): #装备:主动技能
obj.life_value = obj.life_value - self.attack_force 剑魂 = Weapon('sword_soul',50,250,199,10000) if egg.money > 剑魂.price:
剑魂.update(egg)
egg.weapon = 剑魂 print(旺财.life_value)
print(egg.aggr)
egg.attack(旺财)
print(旺财.life_value) egg.weapon.kill(旺财)
print(旺财.life_value)
egg.weapon.kill(旺财)
print(旺财.life_value)

人狗大战

补充:

dir(类) #返回类中的所有名字列表
isinstance(对象,类) #判断对象是否为类的实例
print(Person.__dict__) # 返回一个字典 key是属性名,value是属性值
print(Person.__module__) #person类所在的模块
print(Person.__name__,type(Person.__name__)) #字符串数据类型的类名
from collections import namedtuple
p = namedtuple('Point',['x','y'])
p1 = p(1,2)
print(p.__name__)
 

pyhton之路---面向对象的更多相关文章

  1. GO语言的进阶之路-面向对象编程

    GO语言的进阶之路-面向对象编程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 当你看完这篇文章之时,我可以说你的Golang算是入门了,何为入门?就是你去看Docker 源码能看 ...

  2. Scala进阶之路-面向对象编程之类的成员详解

    Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...

  3. [js高手之路]面向对象版本匀速运动框架

    这篇文章的效果,需要看过以下3篇文章: [js插件开发教程]一步步开发一个可以定制配置的隔行变色小插件 [js高手之路]匀速运动与实例实战(侧边栏,淡入淡出) [js高手之路]打造通用的匀速运动框架 ...

  4. python之路----面向对象的多态特性

    多态 多态指的是一类事物有多种形态 动物有多种形态:人,狗,猪 import abc class Animal(metaclass=abc.ABCMeta): #同一类事物:动物 @abc.abstr ...

  5. 百万年薪python之路 -- 面向对象之继承

    面向对象之继承 1.什么是面向对象的继承 继承(英语:inheritance)是面向对象软件技术当中的一个概念. 通俗易懂的理解是:子承父业,合法继承家产 专业的理解是:子类可以完全使用父类的方法和属 ...

  6. python之路——面向对象(进阶篇)

    面向对象进阶:类成员.类成员的修饰符.类的特殊成员 类成员 类成员分为三大类:字段.方法.属性 一.字段 静态字段 (属于类) 普通字段(属于对象) class City: # 静态字段 countr ...

  7. python之路——面向对象(基础篇)

    面向对象编程:类,对象 面向对象编程是一种编程方式,此编程方式的落地需要使用 "类" 和 "对象" 来实现,所以,面向对象编程其实就是对 "类&quo ...

  8. Python学习之路--面向对象

    1.面向对象概述 面向过程:根据业务逻辑从上到下写垒代码  函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可  面向对象:对函数进行分类和封装,让开发“更快更好更强...”  面向 ...

  9. python之路——面向对象

    面向过程 VS 面向对象 面向过程的程序设计的核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复 ...

随机推荐

  1. win10下vagrant+centos7 rails虚拟开发机配置流程

    此文写于2017.8.21 在写本文前,笔者已经尝试了多种其他的替代方法,例如wmware虚拟机安装kylin.然而发现总是还有各种问题.经大佬指点安装了virtualbox + vagrant.于是 ...

  2. Ajax 学习笔记

    什么是 AJAX ? AJAX = 异步 JavaScript 和 XML. AJAX 是一种用于创建快速动态网页的技术. 通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新.这意味 ...

  3. [js高手之路] 跟GhostWu一起封装一个字符串工具库-扩展camelize与dasherize方法(3)

    在此之前,我们已经完成了4个方法: trimLeft, trimRight, trim, capitalize 本文,我们扩展驼峰式与下划线转化这两个对称的方法 camelize: 把空格,下划线,中 ...

  4. Hibernate2---- 查询单条记录

    1.根据已完成的Hibernate1基础案例,我们接下来写一下查询,修改删除,对于基础生可以学习一下 只改写一下测试类的代码 private void findStudent() { //02Hibe ...

  5. VS2017 Cordova 出现错误 @ionic/app-scripts 未安装

    在安装vs2017 Cordova中遇到出现错误 @ionic/app-scripts 未安装 在系统添加环境变量SASS_BINARY_PATH,将我们下载的win32-ia64-47_bindin ...

  6. Ext.NET webform

    Ext.NET是基于跨浏览器的ExtJS库和.NET Framework的一套支持ASP.NET AJAX的非开源Web控件,包含有丰富的Ajax运用,其前身是Coolite[1]  .

  7. java String时间转为时间戳

    String startDate="2017-08-15"; String endDate="2017-08-15"; SimpleDateFormat for ...

  8. asp.net mvc 动态编译生成Controller

    做网站后台管理系统的时候,有时我们需要根据用户的录入配置动态生成一些频道,这些频道需要用到独立的Controller,这时就需要用到运行时动态编译了.代码如下: using System.Web.Mv ...

  9. MyEclipse 2014各种优化设置

    各种优化大整合,陆续更新使用中的问题,也欢迎大家提问. 1.通用优化设置:字体,UTF-8编码格式设置: http://jingyan.baidu.com/article/b907e627d2c5da ...

  10. 【渗透课程】前言-揭开Web渗透与安全的面纱(必看)

    服务器是怎么被入侵的 攻击者想要对一台计算机渗透必须具备以下条件: 1.服务器与客户端能够正常通讯 (服务器是为客户端提供服务的) 2.服务器向客户端提供的权限(服务)或者说是端口. 服务端所提供的服 ...