一. 类空间,对象空间

1. 类空间,对象空间

  创建一个类就会创建一个类的名称空间,用来存储类中定义的所有名字,这些名字称为类的属性

而类有两种属性:静态属性和动态属性

  • 静态属性就是直接在类中定义的变量
  • 动态属性就是定义在类中的方法

  其中类的数据属性是共享给所有对象的,用类名是找不到对象属性的

  创建一个对象/实例就会创建一个对象/实例的名称空间,存放对象/实例的名字,称为对象/实例的属性. 在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常.

  查询顺序:

  对象.属性 : 先从对象空间找,如果找不到,再从类空间找,再找不到,再从父类找...

  类名.属性 : 先从本类空间找,如果找不到,再从父类找....

class Person:
animal = '高级动物'
soul = '有灵魂'
language = '语言' def __init__(self, country, name, sex, age, hight):
self.country = country
self.name = name
self.sex = sex
self.age = age
self.hight = hight def eat(self):
print('%s吃饭' % self.name) def sleep(self):
print('睡觉') def work(self):
print('工作') p1 = Person('菲律宾', 'alex', '未知', 42, 175)
p1.animal = '禽兽' # 通过对象不能改变,只能引用类中的静态变量, 所以修改的不是类中的animal,而是对象p1自己添加了animal属性.
print(p1.animal) # 禽兽 先查找对象里有没有animal属性,如果没有,再去类中查找.
print(Person.animal) # 高级动物
# print(Person.name) #报错,无法用类名查找对象的属性

  计算对象实例化的次数

class Lei:
num = 0 def __init__(self, name, sex):
self.name = name
self.sex = sex
Lei.num = Lei.num + 1 # 要想使用类中的静态变量,必须要用'类名.'去使用 def func(self):
print(self.name, self.sex) obj1 = Lei('alex', '男')
obj2 = Lei('good', '女')
obj3 = Lei('better', '男')
print(Lei.num) #

二. 组合

组合: 给一个类的对象封装一个属性,这个属性是另一个类的对象.

  通过例题来看一下什么是组合

模拟英雄联盟写一个游戏人物的类
要求:
(1)创建一个 Game_role的类.
(2) 构造方法中给对象封装name,ad(攻击力),hp(血量).三个属性.
(3) 创建一个attack方法,此方法是实例化两个对象,互相攻击的功能:
例: 实例化一个对象 盖伦,ad为10, hp为100
实例化另个一个对象 剑豪 ad为20, hp为80
盖伦通过attack方法攻击剑豪,此方法要完成 '谁攻击谁,谁掉了多少血, 还剩多少血'的提示功能.
class Game_role:
def __init__(self, name, ad, hp):
self.name = name
self.ad = ad
self.hp = hp def attack(self, g):
g.hp = g.hp - self.ad # 剑豪剩余的血为剑豪的总血减去盖伦的攻击
print('%s攻击%s,%s掉了%s血, 还剩%s血' % (self.name, g.name, g.name, self.ad, g.hp)) g1 = Game_role('盖伦', 10, 100) # 实例化第一个对象
g2 = Game_role('剑豪', 20, 80) # 实例化第二个对象
g1.attack(g2) # g1调用方法attack,并把g2传给方法attack里的参数'g'
# 盖伦攻击剑豪,剑豪掉了10血, 还剩70血
print(g2.hp) #

  要增加武器(刀棍道等), 需要增加一个类(武器名称,攻击力). 结果要求显示为 : '谁用什么武器攻击谁,谁掉了多少血,  还剩多少血'

class Game_role:
def __init__(self, name, ad, hp):
self.name = name
self.ad = ad
self.hp = hp def attack(self, g):
g.hp = g.hp - self.ad # 剑豪剩余的血为剑豪的总血减去盖伦的攻击
print('%s攻击%s,%s掉了%s血, 还剩%s血' % (self.name, g.name, g.name, self.ad, g.hp)) def armament_weapon(self, wea):
self.wea = wea # 给角色封装一个新的属性(武器) class Weapon:
def __init__(self, name, ad):
self.name = name
self.ad = ad def fight(self, g1, g2):
g2.hp = g2.hp - self.ad
print('%s 用%s攻击%s,%s 掉了%s血,还剩%s血' \
% (g1.name, self.name, g2.name, g2.name, self.ad, g2.hp)) g1 = Game_role('盖伦', 10, 100)
g2 = Game_role('剑豪', 20, 80)
w1 = Weapon('斧头', 30)
g1.armament_weapon(w1) # 把武器的属性传给Game_role类里的armament_weapon方法
print(g1.wea) # 其实就是w1
g1.wea.fight(g1, g2) # g1.wea.fight() = w1.fight()
print(g2.hp) #

python面向对象:类空间,对象空间, 组合的更多相关文章

  1. Python——面向对象、绑定对象、组合

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

  2. python面向对象——类和对象

    一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程(流水线式) 优点:极大的降低了程序的复杂度 缺点:应用场景固定住了,可扩展性差 2.函数式编程 特点: a ...

  3. python面向对象(类和对象及三大特性)

    类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态   面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...

  4. python: 面向对象:类和对象调用类中的变量和方法

    一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...

  5. 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法

    1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...

  6. Python之面向对象类和对象

    Python之面向对象类和对象 定义一个类:class 定义类的语法: class Test(object): """ 类里定义一类事物共同的技能. 可以是变量,也可是函 ...

  7. Python初识类与对象

    Python初识类与对象 类与对象 世界观角度分析类与对象 类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过 ...

  8. Python学习day25-面向对象之组合,多态和封装

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  9. python的类和对象2(self参数)

    python的类和对象2(self参数) 1.python里面对象的方法都会有self参数,它就相当于C++里面的this指针:绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在 ...

随机推荐

  1. hdu1846 Brave Game 博弈

    十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫<勇敢者的游戏>(英文名称:Zathura),一直到现在,我依然对于电影中的部分电脑特技印象深刻.今天,大家选择上 ...

  2. numpy.array

    关于python中的二维数组,主要有list和numpy.array两种. 好吧,其实还有matrices,但它必须是2维的,而numpy arrays (ndarrays) 可以是多维的. 我们主要 ...

  3. mongodb集群性能优化

    mongodb集群性能优化 在前面两篇文章,我们介绍了如何去搭建mongodb集群,这篇文章我们将介绍如何去优化mongodb的各项配置,以达到最优的效果. 警告 不做任何的优化,集群搭建完成之后,使 ...

  4. MySQL Binlog与数据变更

    如果对满足WHERE条件数据执行UPDATE,而UPDATE未导致前后数据发生变化,这种情况下会产生二进制日志么? ========================================== ...

  5. solr 5.0.0 bin/start脚本详细解析

    参考文档:https://cwiki.apache.org/confluence/display/solr/Solr+Start+Script+Reference#SolrStartScriptRef ...

  6. Redis&MongoDB&Zookeeper&Kafka

    目录 Redis MongoDB Zookeeper Kafka Redis 概念 Redis是NoSQL中比较常典型的一个非关系型数据库,在日常工作中也是最为常见的.Redis是一个由C语言编写的开 ...

  7. 20165308 学习基础和C语言基础调查

    学习基础和C语言基础调查 技能学习 我认为给学生具体的, 能实践的, 能马上看到因果关系的教材和练习, 是激发学生兴趣, 好奇心, 求知欲的好方法. -- 引用自<做中学> 老师博客中注重 ...

  8. phpstorm破解方法

    方法1:打开网址 http://idea.lanyus.com/ 选择获取注册码,复制生成的验证码 安装完成后,打开软件,依次选择菜单栏 Help -> Register-> Activa ...

  9. spring-AOP框架(基于配置文件的方式配置AOP)

    .xml: ref-指向,order-指定优先级

  10. App音频内录 录音

    1.android模拟器 天天模拟器+BlueStacks 2.高清内录软件 Audio Record Wizard.exe 3.音频剪切软件 Adobe Audition CS6