用函数做一个简单的游戏:

def Person(name,sex,hp,ad):
self = {'name':name,'sex':sex,'hp':hp,'ad':ad}
def attack(dog): # 闭包
# 人攻击狗
print('%s攻击%s' % (self['name'],dog['name']))
# 狗掉血:狗的血量-人的攻击力
dog['hp'] -= self['ad']
print('%s还剩%s血量' % (dog['name'],dog['hp']))
self['attack'] = attack
return self def Dog(name,kind,hp,ad):
self = {'name':name,'kind':kind,'hp':hp,'ad':ad}
def bite(person):
print('%s咬%s' % (self['name'],person['name']))
# 人掉血:人的血量-狗的攻击力
person['hp'] -= self['ad']
print('%s还剩%s血量' % (person['name'], person['hp']))
if person['hp'] <= 0:
print('%s被%s咬死了\n game over\n%s win' % (person['name'],self['name'],self['name']))
self['bite'] = bite
return self
person = Person('alex','男',100,20)
dog = Dog('wangwang','male',200,100)
person['attack'](dog)
dog['bite'](person)

面向对象编程:

  类的概念:具有相同属性和技能的一类事物。

  对象:就是对一个类具体的描述。

使用面向对象的好处:

  1,使得代码之间的角色关系更加明确。

  2,增强了代码的可扩展性。

  3,规范了对象的属性和技能。

面向对象的特点:结局的不确定性。

查看静态变量的方法:

  第一种方法(只能查,不能进行删改):

class Person:
静态变量 = 123
print(Person.__dict__) # 内置的双下方法
# 查看静态变量的第一种方式:
print(Person.__dict__['静态变量'])
# Person.__dict__['静态变量'] = 456 # 不能这样更改,会报错。

  第二种方法(可查,可删( del ),可改):

class Person:
静态变量 = 123
# 查看静态变量的第二种方法:
print(Person.静态变量) #
Person.静态变量 = 456 # 这种方式可以更改静态变量。
print(Person.静态变量) #
del Person.静态变量
print(Person.静态变量) # 这步会报错,因为查不到'静态变量'(已被删除)

引用动态变量:

  1,类名.方法名  查看这个方法的内存地址。

  2,类名.方法名(实参)  调用了这个方法,必须传一个实参,这个实参传给了self.

class Person:
def func(self): # self 是默认带的,可以不带,但约定俗成都要带上。
print(666)
# print(Person.func) # <function Person.func at 0x0000018ED6EA2400> 打印的是方法的内存地址。
print(Person.func(1)) # 有self就必须传入参数才能执行类里面的函数。
#
# None # 因为没有返回值,所以打印了None

创造一个对象 — 实例化。

    1,  产成一个实例(对象)的过程。

   2,对象 = 类型()

实例化的过程:

  1,创造一个实例,将会作为一个实际参数。

  2,自动触发一个__init__的方法,并且把示例以参数的形式传递给__init__方法中的self形参。

  3,执行完__init__方法之后,会将self自动返回给alex.

class Person:
def __init__(self): # 动态属性 方法(函数) 默认带一个参数self
print('执行了')
alex = Person() # 创造一个对象
# alex 是对象,实例
# Person 是类
# 对象 = 类名()

__init__方法:

  初始化方法,给一个对象添加一些基础属性的方法,一般情况下是针对self的赋值。

  对象:

    在类的内部  self是本类的一个对象

    在类的外部,每一个对象都对应着一个名字,这个对象只想一个对象的内存空间。

    属性的调用:

      对象名.属性名    第一种调用方法

      对象名.__dict__['属性名']    第二种调用方法

    方法的调用:

      类名.方法名(对象名)  方法中的self参数就指向这个对象。

      对象名.方法名()  这样相当于 方法中的self参数直接指向这个对象。

class Person:
role = 'person' # 静态属性
def __init__(self,name,sex,hp,ad):
self.name = name
self.sex = sex
self.hp = hp
self.ad = ad
def attack(self):
print('%s发起了一次攻击' % self.name)
alex = Person('a_sb','不详',1,5)
Person.attack(alex) #类名.方法名(对象名) 方法中的self参数就指向这个对象。
# a_sb发起了一次攻击
alex.attack() # 对象名.方法名() 这样写相当于方法中的self参数直接指向这个对象。
# a_sb发起了一次攻击
# print(alex.name) # a_sb
# print(alex.sex) # 不详
# print(alex.hp) # 1
# print(alex.ad) # 5

python's seventeenth day for me 面向对象的更多相关文章

  1. Python黑帽编程2.9 面向对象编程

    Python黑帽编程2.9 面向对象编程 我个人认为,计算机语言的发展,有两个方向,一个是从低到高的发展过程,在这个过程中,语言的思考和解决问题的方式是面向硬件的.硬件本质上处理的是信号,在此基础上, ...

  2. python学习笔记-(十)面向对象基础

    面向对象相关知识简介 类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例. 类变量:类变量在整个实例化的对象中是公用的.类变量定义 ...

  3. Python 第六篇(上):面向对象编程初级篇

    面向:过程.函数.对象: 面向过程:根据业务逻辑从上到下写垒代码! 面向过程的编程弊:每次调用的时候都的重写,代码特别长,代码重用性没有,每次增加新功能所有的代码都的修改!那有什么办法解决上面出现的弊 ...

  4. Python学习系列(八)( 面向对象基础)

     Python学习系列(八)( 面向对象基础) Python学习系列(七)( 数据库编程) 一,面向对象 1,域:属于一个对象或类的变量.有两种类型,即实例变量—属于每个实例/类的对象:类变量—属于类 ...

  5. python系列十六:Python3 面向对象

    #!/usr/bin/python #-*-coding:gbk-*- #Python3 面向对象 '''面向对象技术简介    类(Class): 用来描述具有相同的属性和方法的对象的集合.它定义了 ...

  6. python学习-第四天补充-面向对象

    python学习-第四天补充-面向对象 python 私有 --name mangling(名字修改.名字) 在命名时,通过使用两个下划线作为开头,可以使得这个变量或者函数编程私有的,但是这个其实的p ...

  7. Python匹马行天下之面向对象

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

  8. python学习笔记-(十一)面向对象进阶&异常处理

    上篇我们已经了解了一些面向对象的基础知识,本次就了解下面向对象的一些进阶知识(虽然我也不知道有什么卵用). 静态方法 静态方法是一种普通函数,就位于类定义的命名空间中,它不会对任何实例类型进行操作.使 ...

  9. 与Python Falling In Love_Python跨台阶(面向对象)

    第二课会介绍Python中的一些变量的使用.列表.元组.字典等一些详细内容...篇幅会比较多...因此在整理中... 先跳过第二课...直接来第三课..Python中面向对象的学习以及与mysql数据 ...

随机推荐

  1. 五十 Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门搜索

    第三百七十一节,Python分布式爬虫打造搜索引擎Scrapy精讲—elasticsearch(搜索引擎)用Django实现我的搜索以及热门 我的搜素简单实现原理我们可以用js来实现,首先用js获取到 ...

  2. spring boot MongoDB的集成和使用

    前言 上一章节,简单讲解了如何集成Spring-data-jpa.本章节,我们来看看如何集成NoSQL的Mongodb.mongodb是最早热门非关系数据库的之一,使用也比较普遍.最适合来存储一些非结 ...

  3. IOS-支付宝

      一.使用支付宝进行一个完整的支付功能,大致有以下步骤: 与支付宝签约,获得商户ID(partner)和账号ID(seller) 下载相应的公钥私钥文件(加密签名用) 下载支付宝SDK 生成订单信息 ...

  4. Doxygen简介

    (转自:http://www.cnblogs.com/liuliunumberone/archive/2012/04/10/2441391.html) 一.什么是Doxygen? Doxygen 是一 ...

  5. 【专题】区间dp

    1.[nyoj737]石子合并 传送门:点击打开链接 描述    有N堆石子排成一排,每堆石子有一定的数量.现要将N堆石子并成为一堆.合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这 ...

  6. 下载并安装Prism5.0库(纯汉语版)

    Prism5.0中包含了文档,WPF代码示例,程序集.本篇告诉你从哪里获取程序集和代码示例,还有NuGet包的内容. 对于新功能,资产,和API的更改信息,请看Prism5.0新内容. 文档 Pris ...

  7. WinForm与Javascript交互

    在应用程序的集成过程中,有时候需要WinForm应用程序和Javascript程序进行交互.比如说:应用程序是一个综合调度系统,在整个综合调度系统中,要实现定位,显示地图.综合调度平台的大部分功能都是 ...

  8. MySQL 解决 emoji表情 的方法,使用utf8mb4 字符集(4字节 UTF-8 Unicode 编码)

    p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px 'Helvetica Neue'; color: #454545} span.s1 {font: ...

  9. canvas 绘制验证码

    注意: 真正项目中验证码图片都是由服务器端(PHP.JSP.Node.js)技术来生成. 最终效果: 代码: <!DOCTYPE html> <html> <head l ...

  10. 特例模式(Special Case Pattern)与空对象模式(Null Pointer Pattern)—— 返回特例对象而非 null

    返回 null 值,基本上是在给自己增加工作量,也是给调用者添乱.只有一处没有检查返回的是否为 null,程序就会抛 NullPointerException 异常. 如果你打算在方法中返回 null ...