详解python对象之间的交互


Posted in Python onSeptember 29, 2020

先看看一般的类定义如下:

class 类名:
  def __init__(self,参数1,参数2):
    self.对象的属性1 = 参数1
    self.对象的属性2 = 参数2

  def 方法名(self):pass

  def 方法名2(self):pass

对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西
         #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法
         #括号里传参数,参数不需要传self,其他与init中的形参一一对应
         #结果返回一个对象
对象名.对象的属性1  #查看对象的属性,直接用 对象名.属性名 即可
对象名.方法名()   #调用类中的方法,直接用 对象名.方法名() 即可

对象之间的交互

现在我们已经有一个人类了,通过给人类一些具体的属性我们就可以拿到一个实实在在的人。
现在我们要再创建一个狗类,狗就不能打人了,只能咬人,所以我们给狗一个bite方法。
有了狗类,我们还要实例化一只实实在在的狗出来。
然后人和狗就可以打架了。现在我们就来让他们打一架吧!

class Person: # 定义一个人类
  role = 'person' # 人的角色属性都是人

  def __init__(self, name, aggressivity, life_value):
    self.name = name # 每一个角色都有自己的昵称;
    self.aggressivity = aggressivity # 每一个角色都有自己的攻击力;
    self.life_value = life_value # 每一个角色都有自己的生命值;

  def attack(self,dog):
    # 人可以攻击狗,这里的狗也是一个对象。
    # 人攻击狗,那么狗的生命值就会根据人的攻击力而下降
    dog.life_value -= self.aggressivity

class Dog: # 定义一个狗类
  role = 'dog' # 狗的角色属性都是狗

  def __init__(self, name, breed, aggressivity, life_value):
    self.name = name # 每一只狗都有自己的昵称;
    self.breed = breed # 每一只狗都有自己的品种;
    self.aggressivity = aggressivity # 每一只狗都有自己的攻击力;
    self.life_value = life_value # 每一只狗都有自己的生命值;

  def bite(self,people):
    # 狗可以咬人,这里的狗也是一个对象。
    # 狗咬人,那么人的生命值就会根据狗的攻击力而下降
    people.life_value -= self.aggressivity

egg = Person('egon',10,1000) #创造了一个实实在在的人eggprint(egg.name)        # 在obj.name会先从obj自己的名称空间里找name,找不到则去类中找,类也找不到就找父类...最后都找不到就抛出异常
ha2 = Dog('二愣子','哈士奇',10,1000) #创造了一只实实在在的狗ha2
print(ha2.life_value)     #看看ha2的生命值
egg.attack(ha2)        #egg打了ha2一下
print(ha2.life_value)     #ha2掉了10点血

面向对象的组合用法

组合指的是,在一个类中以另外一个类的对象作为数据属性,称为类的组合

class Weapon:
  def prick(self, obj): # 这是该装备的主动技能,扎死对方
    obj.life_value -= 500 # 假设攻击力是500

class Person: # 定义一个人类
  role = 'person' # 人的角色属性都是人

  def __init__(self, name):
    self.name = name # 每一个角色都有自己的昵称;
    self.weapon = Weapon() # 给角色绑定一个武器;
    
egg = Person('egon')
egg.weapon.prick() 
#egg组合了一个武器的对象,可以直接egg.weapon来使用组合类中的所有方法

圆环是由两个圆组成的,圆环的面积是外面圆的面积减去内部圆的面积。圆环的周长是内部圆的周长加上外部圆的周长。
这个时候,我们就首先实现一个圆形类,计算一个圆的周长和面积。然后在"环形类"中组合圆形的实例作为自己的属性来用

from math import pi

class Circle:
  '''
  定义了一个圆形类;
  提供计算面积(area)和周长(perimeter)的方法
  '''
  def __init__(self,radius):
    self.radius = radius

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

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


circle = Circle(10) #实例化一个圆
area1 = circle.area() #计算圆面积
per1 = circle.perimeter() #计算圆周长
print(area1,per1) #打印圆面积和周长

class Ring:
  '''
  定义了一个圆环类
  提供圆环的面积和周长的方法
  '''
  def __init__(self,radius_outside,radius_inside):
    self.outsid_circle = Circle(radius_outside)
    self.inside_circle = Circle(radius_inside)

  def area(self):
    return self.outsid_circle.area() - self.inside_circle.area()

  def perimeter(self):
    return self.outsid_circle.perimeter() + self.inside_circle.perimeter()


ring = Ring(10,5) #实例化一个环形
print(ring.perimeter()) #计算环形的周长
print(ring.area()) #计算环形的面积

用组合的方式建立了类与组合的类之间的关系,它是一种‘有'的关系,比如教授有生日,教授教python课程

class BirthDate:
  def __init__(self,year,month,day):
    self.year=year
    self.month=month
    self.day=day

class Couse:
  def __init__(self,name,price,period):
    self.name=name
    self.price=price
    self.period=period

class Teacher:
  def __init__(self,name,gender,birth,course):
    self.name=name 
    self.gender=gender
    self.birth=birth
    self.course=course
  def teach(self): 
    print('teaching')

p1=Teacher('egon','male', 
      BirthDate('1995','1','27'), 
      Couse('python','28000','4 months')
      ) 

print(p1.birth.year,p1.birth.month,p1.birth.day) 

print(p1.course.name,p1.course.price,p1.course.period)
''' 
运行结果: 
1995 1 27 
python 28000 4 months 
'''

以上就是详解python对象之间的交互的详细内容,更多关于python 对象交互的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python3.2中Print函数用法实例详解
May 19 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
Apr 24 Python
Python3使用正则表达式爬取内涵段子示例
Apr 22 Python
基于python神经卷积网络的人脸识别
May 24 Python
关于Django ForeignKey 反向查询中filter和_set的效率对比详解
Dec 15 Python
python opencv 读取本地视频文件 修改ffmpeg的方法
Jan 26 Python
python分数表示方式和写法
Jun 26 Python
Python模拟登录之滑块验证码的破解(实例代码)
Nov 18 Python
解决python多线程报错:AttributeError: Can't pickle local object问题
Apr 08 Python
协程Python 中实现多任务耗资源最小的方式
Oct 19 Python
python pillow库的基础使用教程
Jan 13 Python
Jmeter调用Python脚本实现参数互相传递的实现
Jan 22 Python
python PIL模块的基本使用
Sep 29 #Python
Python 如何实现数据库表结构同步
Sep 29 #Python
scrapy-redis分布式爬虫的搭建过程(理论篇)
Sep 29 #Python
python ssh 执行shell命令的示例
Sep 29 #Python
Scrapy基于scrapy_redis实现分布式爬虫部署的示例
Sep 29 #Python
浅析python 字典嵌套
Sep 29 #Python
详解基于Scrapy的IP代理池搭建
Sep 29 #Python
You might like
使用zend studio for eclipse不能激活代码提示功能的解决办法
2009/10/11 PHP
如何使用php判断所处服务器操作系统的类型
2013/06/20 PHP
深入理解PHP中的Session和Cookie
2013/06/21 PHP
实例讲解PHP面向对象之多态
2014/08/20 PHP
thinkphp验证码的实现(form、ajax实现验证)
2016/07/28 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
JS支持带x身份证号码验证函数
2008/08/10 Javascript
Extjs学习笔记之三 extjs form更多的表单项
2010/01/07 Javascript
NodeJS制作爬虫全过程
2014/12/22 NodeJs
javascript实现的右下角弹窗实例
2015/04/24 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
简介BootStrap model弹出框的使用
2016/04/27 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
Node.js 数据加密传输浅析
2016/11/16 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
nodejs利用ajax实现网页无刷新上传图片实例代码
2017/06/06 NodeJs
基于es6三点运算符的使用方法(实例讲解)
2017/10/12 Javascript
react-router4 配合webpack require.ensure 实现异步加载的示例
2018/01/18 Javascript
Element Input组件分析小结
2018/10/11 Javascript
[02:15]2014DOTA2国际邀请赛 专访LGD.lin小兔子是大腿
2014/07/14 DOTA
python改变日志(logging)存放位置的示例
2014/03/27 Python
简单了解django缓存方式及配置
2019/07/19 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
如何基于Python实现自动扫雷
2020/01/06 Python
python中round函数如何使用
2020/06/19 Python
详解pandas apply 并行处理的几种方法
2021/02/24 Python
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
Perfume’s Club中文官网:西班牙美妆在线零售品牌
2020/08/24 全球购物
芭比波朗加拿大官方网站:Bobbi Brown Cosmetics CA
2020/11/05 全球购物
幼儿园教学管理制度
2014/02/04 职场文书
《小猪家的桃花树》教学反思
2014/04/11 职场文书
2014年销售部工作总结
2014/12/01 职场文书
小学生优秀评语
2014/12/29 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
高中运动会广播稿
2015/08/19 职场文书