一. 类空间,对象空间

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. 【BZOJ1082】【SCOI2005】栅栏

    暴力出奇迹…… 原题: 农夫约翰打算建立一个栅栏将他的牧场给围起来,因此他需要一些特定规格的木材.于是农夫约翰到木材店购买木材.可是木材店老板说他这里只剩下少部分大规格的木板了.不过约翰可以购买这些木 ...

  2. oracle数据库丢失数据文件、控制文件、重做日志文件、初始化文件恢复方法

    rman  target/ list backup; 查看是否已备份,如果没有,那就不知道了 模拟故障,删除/u01/app/oracle/oradata/ORCL文件夹下的所有文件 sqlplus ...

  3. VM安装系统时提示硬件不支持(unsupported hardware detected)

    修改一下虚拟机配置,把CD/DVD中使用的autoinst.iso替换成需要安装的系统镜像文件 然而,后面发现还是会报这个错,不过,却可以正常安装下去.但是如果不修改这里的话,安装系统时会出错

  4. linux下PHP手动添加扩展库

    1.进入php源程序目录中的ext目录中,这里存放着各个扩展模块的源代码,选择你需要的模块,比如curl模块: cd curl 执行phpize生成编译文件,phpize在PHP安装目录的bin目录下 ...

  5. C++ dynamic reflection

    相关想法以及lib Lua 有想过用reflection实现lua binding,但没想过反过来 moc依赖于qt的lib,不考虑了https://github.com/rttrorg/rttr V ...

  6. mysql之 sysbench0.4.12数据库性能测试

    1. 常用选项 在Shell中运行以下命令便可得到sysbench的常用选项信息: sysbench --help 上述命令的输出信息如下图所示: 1.1 使用语法 使用sysbench时,可以通过以 ...

  7. this、new,容易混淆的地方

    this.new,容易混淆的地方 情况1 关系 情况2 new Foo() 等价于,推荐的写法是new Foo() new Foo new Foo() 不一样 Foo(), Foo()这种情况下,构造 ...

  8. python selenium-webdriver 标签页切换(十五)

    测试过程中有时候会遇到点击某个按钮或者链接会弹出新的窗口,这时候我们的操作的页面还保持着最初打开页面,但是此时我们需要操作新打开的页面上的功能,这个时候我们需要切换一下标签页 . 其实页面的切换与fr ...

  9. dashboard无法查到endpoint, counter

    问题 使用Open-falcon时,Agent 推送metrics后,无法在Dashboard上显示.将Agent的hostname 修改后,却可以. 解决办法 查看Agent log,推送到tran ...

  10. mysql update 将一个表某字段设为另一个表某字段的值

    表新添加了一个字段,毫无疑问是空值.所以想将另一个表的某个字段的值写入到修改的表中. sql语句不复杂,但还是记录一下,因为也查了一会,以后说不定还会用到. mysql> update cent ...