python面向对象:类空间,对象空间, 组合
一. 类空间,对象空间
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面向对象:类空间,对象空间, 组合的更多相关文章
- Python——面向对象、绑定对象、组合
1. 面向过程VS面向对象 (1)面向过程 核心是过程(流水线式思维),过程即解决问题的步骤,面向过程的设计就好比精心设计好一条流水线,考虑周全什么时候处理什么东西. 优点是:极大的降低了写程序的复杂 ...
- python面向对象——类和对象
一.三大编程范式 编程范式即编程的方法论,标识一种编程风格 三大编程范式: 1.面向过程编程(流水线式) 优点:极大的降低了程序的复杂度 缺点:应用场景固定住了,可扩展性差 2.函数式编程 特点: a ...
- python面向对象(类和对象及三大特性)
类和对象是什么 创建类 新式类 和 经典类 面向对象三大特性 继承 封装 多态 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使 ...
- python: 面向对象:类和对象调用类中的变量和方法
一. 面向对象初识 我们在生活中做事都是面向过程的,前面实现一些基本逻辑功能代码也是用面向过程的语句实现的,后来学了函数,把这些功能又装到了函数里.但用面向过程的方法去写程序,只能实现一个功能,我们要 ...
- 1.面向过程编程 2.面向对象编程 3.类和对象 4.python 创建类和对象 如何使用对象 5.属性的查找顺序 6.初始化函数 7.绑定方法 与非绑定方法
1.面向过程编程 面向过程:一种编程思想在编写代码时 要时刻想着过程这个两个字过程指的是什么? 解决问题的步骤 流程,即第一步干什么 第二步干什么,其目的是将一个复杂的问题,拆分为若干的小的问题,按照 ...
- Python之面向对象类和对象
Python之面向对象类和对象 定义一个类:class 定义类的语法: class Test(object): """ 类里定义一类事物共同的技能. 可以是变量,也可是函 ...
- Python初识类与对象
Python初识类与对象 类与对象 世界观角度分析类与对象 类是一个抽象的概念,而对象是一个实体的存在,对象由类创造而出,每个对象之间互相独立互不影响,一个对象可以同时拥有多个类的方法,实例化就是通过 ...
- Python学习day25-面向对象之组合,多态和封装
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- python的类和对象2(self参数)
python的类和对象2(self参数) 1.python里面对象的方法都会有self参数,它就相当于C++里面的this指针:绑定方法,据说有了这个参数,Python 再也不会傻傻分不清是哪个对象在 ...
随机推荐
- MongoDB 副本集 pymongo使用
搭建没有仲裁节点的副本集,推荐使用 2.清空node2的db文件夹 和 log 文件夹 rm -rf /var/lib/mongod/* rm -rf /var/log/mongod/* 3.修改no ...
- python可变类型和不可变类型
原文地址:http://www.cnblogs.com/huamingao/p/5809936.html 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutab ...
- (惊艳)hashmap的理解(映射)
第一: hashmap在内存中是长这样的,数组+链表的形式 // HashMap采用链表法解决冲突,每一个Entry本质上是一个单向链表 transient Entry[] table; 第二: p ...
- ORM 之常用重点 ******
总体介绍orm>>点我 单表查询api汇总 如 distinc(),order_by() id__gt=1 id__inrange=[ 1,3 ] 左右都包含 设置logg ...
- bloom-server 基于 rust 编写的 rest api cache 中间件
bloom-server 基于 rust 编写的 rest api cache 中间件,他位于lb 与api worker 之间,使用redis 作为缓存内容存储, 我们需要做的就是配置proxy,同 ...
- GlusterFS学习
环境准备 3台机器,每个机器双网卡,每个机器还需要额外添加1个10GB的磁盘用于测试 机器系统版本是centos6.6 [root@gluster-1-1 ~]# uname -rm 2.6.32-5 ...
- oracle之 ORA-12557: TNS: 协议适配器不可加载
操作系统:windows 7数据库版本: 11.2.0.1问题描述:直接通过 sqlplus sys/oracle@10.10.100.109:1521/ysxt as sysdba 可以登录,但是通 ...
- antd、react-router-dom v4 解决菜单和地址同步问题
点击不同的菜单,右边内容做相应的变化. 不过,对于后退操作和刷新页面操作无效,左边菜单无法保持选中项高亮. 解决思路如下: Menu 用 seletedKeys 来决定哪项被选中.需要判断当前选前的路 ...
- k8s 的使用
Kubernetes 是什么:在 Docker 技术的基础上,为容器化的应用提供部署运行.资源调度.服务发现和动态伸缩等一系列完整功能,提高了大规模容器集群管理的便捷性的工具.
- 阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href
阅读OReilly.Web.Scraping.with.Python.2015.6笔记---找出网页中所有的href 1.查找以<a>开头的所有文本,然后判断href是否在<a> ...