一. 类空间,对象空间

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. 堆栈详解 + 彻底理解Java的值传递和引用传递

    本文旨在用最通俗的语言讲述最枯燥的基本知识 学过Java基础的人都知道:值传递和引用传递是初次接触Java时的一个难点,有时候记得了语法却记不得怎么实际运用,有时候会的了运用却解释不出原理,而且坊间讨 ...

  2. 固态硬盘和机械硬盘双硬盘安装win10,提示无法找到系统

    选择兼容模式,自己慢慢找,不同的主板所在的位置不同,大概是cms(兼容的意思)这个选项,选择enable就可以了

  3. SAS常用函数

    SAS常用函数 一.数学函数  ABS(x) 求x的绝对值. MAX(x1,x2,…,xn) 求所有自变量中的最大一个. MIN(x1,x2,…,xn) 求所有自变量中的最小一个. MOD(x,y) ...

  4. 996.icu 事件后

    996.icu 事件后 雇主 更加关注效率 减少成本 分工再细化 精简人员 雇员 法律意识加强 个人权利争取 效率低者下岗 技能提高 效率提高 影响 商业社会更有效率 人力市场竞争更加激烈 国内竞争力 ...

  5. 关于 php 和 python 的浮点计算 0.1+0.2

    关于 php 和 python 的浮点计算 0.1+0.2 看到群里有小伙伴说为什么 python 计算出 0.1+0.2 是 0.30000000000000004 >>> pri ...

  6. python装饰器学习笔记

    定义:本质上就是个函数,(装饰器其他函数)就是为了给其他函数添加附加功能 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 #-*-coding:utf-8-*- 1 imp ...

  7. PHP socket 服务器框架集

    1.Swoole:重新定义PHP PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时 ...

  8. bzoj 4184 shallot——线段树分治+线性基

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 本来想了可持久化trie,不过空间是 nlogn (出一个节点的时候把 tot 复原就 ...

  9. jsp配置文件数据信息读取

    一.jsp从配置文件*.properties读取信息 <%@ page language="java" import="java.util.*" cont ...

  10. 中文自然语言处理工具HanLP源码包的下载使用记录

    中文自然语言处理工具HanLP源码包的下载使用记录 这篇文章主要分享的是hanlp自然语言处理源码的下载,数据集的下载,以及将让源代码中的demo能够跑通.Hanlp安装包的下载以及安装其实之前就已经 ...