返回顶部
首页 > 资讯 > 后端开发 > Python >python3--对象之间的交互,类命名空间与对象、实例的命令空间
  • 196
分享到

python3--对象之间的交互,类命名空间与对象、实例的命令空间

对象空间实例 2023-01-30 21:01:28 196人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

对象之间的交互现在有个游戏人与狗,人定义一个类,狗定义一个类,如何让两个类之间互相交互起来,让这个游戏变得更加有意思,代码如下#!/usr/bin/env python # coding: utf-8 __au

对象之间的交互

现在有个游戏人与狗,人定义一个类,狗定义一个类,如何让两个类之间互相交互起来,让这个游戏变得更加有意思,代码如下

#!/usr/bin/env pythoncoding: utf-8
__author__ = 'www.py3study.com'
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, dog):
        # 人可以攻击狗,这里的dog也是一个对象
        # 人攻击狗,那么狗的生命值会根据人的攻击力而下降
        dog.hp -= self.ad
        print('{}攻击了{},{}掉了{}点血'.fORMat(self.name,dog.name,dog.name,self.ad))

class Dog:  # 定义狗类
    role = 'dog'
    def __init__(self, name, breed, hp, ad):
        self.name = name  # 每一只狗都有自己的昵称
        self.breed = breed  # 狗品种
        self.hp = hp  # 狗的血量
        self.ad = ad  # 狗的攻击力

    def bite(self, people):
        # 狗可以咬人,这里的狗也是一个对象
        # 狗咬人,那么人的生命值就会根据狗的攻击力下降
        people.hp -= self.ad
        print('{}攻击了{},{}掉了{}点血'.format(self.name, people.name, people.name, self.ad))

boss_sam = Person('Sam', '男', 100, 100)  # 实例化一个角色boss_sam
ha2 = Dog('二愣子', '哈士奇', 50, 50)     # 实例化一个角色ha2
boss_sam.attack(ha2)  # boss_sam攻击了ha2, 
print(ha2.hp)         # 打印ha2的血量
ha2.bite(boss_sam)    # ha2咬了boss_sam
print(boss_sam.hp)    # 打印boss_sam的血量

执行结果

Sam攻击了二愣子,二愣子掉了100点血

-50

二愣子攻击了Sam,Sam掉了50点血

50


例2

from math import pi
class Circle:  # Circle类名
    '''
    定义了一个圆形类;
    提供计算面积(area)和周长(perimeter)的方法
    圆的面积为:圆周率×2×半径
    圆的周长为:圆周率×半径的平方
    '''
    def __init__(self, radius):  # radius半径
        self.radius = radius

    def perimeter(self):
        return pi * self.radius * 2

    def area(self):
        return pi * self.radius ** 2

circle = Circle(10)  # 实例化一个圆,传入半径值10
areal = circle.area()  # 计算圆面积
perl = circle.perimeter()  # 计算圆周长
print('半径为10的圆面积是:{},周长是{}'.format(areal,perl))

执行结果

半径为10的圆面积是:314.1592653589793,周长是62.83185307179586


例3,上面题目的升级版,计算半径分别是1,3,5,7,9圆的面积与周长

from math import pi
class Circle:  # Circle类名
    '''
    定义了一个圆形类;
    提供计算面积(area)和周长(perimeter)的方法
    圆的面积为:圆周率×2×半径
    圆的周长为:圆周率×半径的平方
    '''
    def __init__(self, radius):  # radius半径
        self.radius = radius

    def perimeter(self):
        return pi * self.radius * 2

    def area(self):
        return pi * self.radius ** 2

for i in range(1,10,2):  # 步长为2,i的值为1,3,5,7,9
    cl = Circle(i)  # 实例化参入变量i,i为半径1,3,5,7,9
    print(cl.perimeter())  # 打印圆周长
    print(cl.area())  # 打印圆面积

执行结果

6.283185307179586

3.141592653589793

18.84955592153876

28.274333882308138

31.41592653589793

78.53981633974483

43.982297150257104

153.93804002589985

56.548667764616276

254.46900494077323


类命名空间与对象、实例的命名空间

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

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

1 静态属性就是直接在类中定义的变量

2 动态属性就是定义在类中的方法

例1,错误的示例

class Person:
    role = 'person'
    def __init__(self, name, sex, hp, ad):
        self.name = name
        self.sex = sex
        self.hp = hp
        self.ad = ad
        self.attack = 'hahaha哦了'

    def attack(self):
        print('{}发起了一次攻击'.format(self.name))

sam = Person('sam_sb', '不详', 9999, 9999)
sam.attack()
print(sam.__dict__)

执行报错

TypeError: 'str' object is not callable

为什么呢?因为attack变成字符串了,它不能执行

blob.png

改成

print(sam.attack)

print(sam.__dict__)

执行结果

hahaha哦了

{'sex': '不详', 'ad': 9999, 'name': '高富帅', 'hp': 9999, 'attack': 'hahaha哦了'}


类的数据属性是共享给所有对象的,根据上面的例子,在添加一个实例对象

class Person:
    role = 'person'
    def __init__(self, name, sex, hp, ad):
        self.name = name
        self.sex = sex
        self.hp = hp
        self.ad = ad
        self.attack = 'hahaha哦了'

    def attack(self):
        print('{}发起了一次攻击'.format(self.name))

sam = Person('白人', '不详', 9999, 9999)
tom = Person('黑人', '不详', 1, 1)
print(sam.role)
print(tom.role)

执行结果

person

person


修改类变量

class Person:
    role = 'person'
    def __init__(self, name, sex, hp, ad):
        self.name = name
        self.sex = sex
        self.hp = hp
        self.ad = ad
        self.attack = 'hahaha哦了'

    def attack(self):
        print('{}发起了一次攻击'.format(self.name))

sam = Person('白人', '不详', 9999, 9999)
tom = Person('黑人', '不详', 1, 1)
sam.role = 'hahaha'
print(sam.role)
print(tom.role)

执行结果

hahaha

person

但凡是对象操作类属性,它是没有权利的,它只能存储在自己内存空间里面,类可以没有init方法


模拟人生游戏,模拟一家人赚钱的游戏

例,错误示例

class Person:
    money = 0
    def __init__(self, name):
        self.name = name
    def work(self):
        print(self.name, '工作,赚了1000块')
        self.money += 1000

father = Person('father')
mother = Person('motner')
father.work()
mother.work()
print(Person.money)

执行结果

father 工作,赚了1000块

motner 工作,赚了1000块

0


但是钱没有涨?为什么?

每一次重新赋值,相当于一个新的变量

加法运算时,拿了类变量,对于类变量,mong=0,它还是0

怎么解决这个问题呢?

例2

class Person:
    money = 0
    def __init__(self, name):
        self.name = name
    def work(self):
        print(self.name, '工作,赚了1000块')
        Person.money += 1000

father = Person('father')
mother = Person('motner')
father.work()
mother.work()
print(Person.money)

执行结果

father 工作,赚了1000块

motner 工作,赚了1000块

2000


对于静态属性的修改,应该使用类名直接修改,就不会出现不一致的情况,因为类属性是共享的


练习题,写一个类,完成一个功能,可以统计这个类有几个对象

class Foo:
    count = 0
    def __init__(self):
        Foo.count += 1
f1 = Foo()  #实例化一个对象
f2 = Foo()  #实例化一个对象
f3 = Foo()  #实例化一个对象
print(Foo.count)

执行结果

3


例2:可变数据类型当做类静态属性(有坑!)

class Person:
    money = [0]  # money为一个列表
    def __init__(self, name):
        self.name = name
    def work(self):
        print(self.name, '工作,赚了1000块')
        self.money[0] += 1000

father = Person('father')
mother = Person('motner')
father.work()
mother.work()
print(Person.money)

执行结果

father 工作,赚了1000块

motner 工作,赚了1000块

[2000]

为什么是2000?

blob.png


例3:

class Person:
    money = [0]  # money为一个列表
    def __init__(self, name):
        self.name = name
    def work(self):
        print(self.name, '工作,赚了1000块')
        self.money = [Person.money[0] + 1000]

father = Person('father')
mother = Person('motner')
father.work()
mother.work()
print(Person.money)

执行结果

father 工作,赚了1000块

motner 工作,赚了1000块

[0]

为什么结果是0?

blob.png

不管是类里面还是类外面,统一使用:类名.静态变量名

--结束END--

本文标题: python3--对象之间的交互,类命名空间与对象、实例的命令空间

本文链接: https://lsjlt.com/news/179046.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python3--对象之间的交互,类命名空间与对象、实例的命令空间
    对象之间的交互现在有个游戏人与狗,人定义一个类,狗定义一个类,如何让两个类之间互相交互起来,让这个游戏变得更加有意思,代码如下#!/usr/bin/env python # coding: utf-8 __au...
    99+
    2023-01-30
    对象 空间 实例
  • ADO.NET OracleClient命名空间对象有哪些
    本篇内容主要讲解“ADO.NET OracleClient命名空间对象有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ADO.NET OracleClient命名空间对象有哪些”吧!大家都知...
    99+
    2023-06-17
  • 搞懂Python的类和对象名称空间
    代码块的分类 python中分几种代码块类型,它们都有自己的作用域,或者说名称空间: 文件或模块整体是一个代码块,名称空间为全局范围 函数代码块,名称空间为函数自身范围,是本地作用域,在全局范围的内层 函数内部可嵌套函数,嵌套函数...
    99+
    2023-01-30
    对象 名称 空间
  • 【C++】命名空间 namespace 与 标准流 iostream ( 命名空间概念简介 | 命名空间定义 | 命名空间使用 | iostream 中的命名空间分析 )
    文章目录 一、命名空间 namespace1、命名空间基本概念2、名称概念4、C 语言的命名空间3、命名空间避免标识符冲突 二、命名空间定义1、命名空间基本概念2、命名空间定义语法3、代码示例 - 命名空间定义使用 三、命名...
    99+
    2023-08-20
    c++ namespace iostream 命名空间 标准流 原力计划
  • java对象与json对象之间互相转换实现方法示例
    本文实例讲述了java对象与json对象之间互相转换实现方法。分享给大家供大家参考,具体如下:import java.util.ArrayList;import java.util.Collection;import java.util.I...
    99+
    2023-05-30
    java json ava
  • C++中的命名空间实例分析
    这篇“C++中的命名空间实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++中的命名空间实例分析”文章吧。命名空间的...
    99+
    2023-06-29
  • namesapce命名空间的示例分析
    这篇文章主要介绍了namesapce命名空间的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.命名空间的使用目的   在PHP中函数、类、常量是不允许同名...
    99+
    2023-06-06
  • Flex命名空间的示例分析
    这篇文章主要介绍了Flex命名空间的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。Flex命名空间详解通过命名空间可以控制所创建的属性和方法的可见性。请将public...
    99+
    2023-06-17
  • Linux查看磁盘空间与磁盘空间管理的命令
    这篇文章主要介绍“Linux查看磁盘空间与磁盘空间管理的命令”,在日常操作中,相信很多人在Linux查看磁盘空间与磁盘空间管理的命令问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux查看磁盘空间与磁盘空...
    99+
    2023-06-12
  • JSON 与 Java 对象之间的转化
    前言 在现在的日常开发中,不管前端还是后端,JSON 格式的数据是用得比较多的,甚至可以说无处不在。 接触最多的就是 POST 请求中传递的数据一般以 JSON 的格式放在请求体中,而且服务端各种 API 返回的数据,在响应体中也基本都是以...
    99+
    2023-09-12
    java json 开发语言
  • 获取python对象占用空间的大小
    原文:http://stackoverflow.com/questions/449560/how-do-i-determine-the-size-of-an-object-in-python  import sys 函数原型:   s...
    99+
    2023-01-31
    对象 大小 空间
  • java--- xml和对象之间的互相转换
    例子是把xml映射成bean成对象 第一种方法是使用 JAXB(Java Architecture for XML Binding) 实现XML与Bean的相互转换 简介 JAXB是一个业界的标准,是一项可以根据X...
    99+
    2023-08-31
    java
  • 关于Python函数对象的名称空间和作用域
    目录1.函数对象(1)函数对象的引用(2)函数可以放到序列里面(3)函数可以作为参数 , 传递给另一个函数(4)函数可以作为另一个函数的返回值2.名称空间3.作用域(1)作用域的理解...
    99+
    2023-05-17
    Python 函数 Python 函数作用域 Python 函数名称空间
  • Java中怎么计算对象占用的空间
    这篇文章给大家介绍Java中怎么计算对象占用的空间,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。对象头对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下:对象的HashCode,锁信息等到对象类型...
    99+
    2023-06-17
  • JavaScript命名空间模式的示例分析
    这篇文章将为大家详细讲解有关JavaScript命名空间模式的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:前言命名空间可以被认为是唯一标识符下代码的逻...
    99+
    2024-04-02
  • PHP关键特性之命名空间的示例分析
    这篇文章主要介绍PHP关键特性之命名空间的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!你知道命名空间主要是为了解决代码中类和函数可能存在冲突的问题的吗?而这个特性其他语言一早就有,PHP则是姗姗来迟,它的出...
    99+
    2023-06-15
  • C语言和命令行之间的交互方式
    本篇内容介绍了“C语言和命令行之间的交互方式”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!在Windows操作系统中,后缀为.exe的文件都...
    99+
    2023-06-20
  • Python面向对象(类之间的关系)(三
    类与类之间的关系     在我们的世界中事物和事物之间总会有一些联系.     在面向对象中. 类和类之间也可以产生相关的关系     1. 依赖关系         执行某个动作的时候. 需要xxx来帮助你完成这个操作. 此时的...
    99+
    2023-01-30
    面向对象 关系 Python
  • C#有哪些常用的类和命名空间
    C#是一种由微软公司开发的面向对象的编程语言,广泛应用于Windows桌面应用程序、Web应用程序、游戏开发、移动应用程序等领域。C#提供了丰富的类和命名空间,可以帮助开发人员快速构建高质量的应用程序。以下是一些常用的C#类和命名空间:1、...
    99+
    2023-10-22
    C#类 C#命名空间
  • fastjson--对象与JSON之间的转换方法
    1、Java对象–>JSON对象: (JSONObject)JSONObject.toJSON(Java对象实例) public class JSON2JavaTest{ public static...
    99+
    2023-09-04
    json java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作