详解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 相关文章推荐
Python查询Mysql时返回字典结构的代码
Jun 18 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
Oct 12 Python
Python排序搜索基本算法之堆排序实例详解
Dec 08 Python
python实现微信跳一跳辅助工具步骤详解
Jan 04 Python
python使用ddt过程中遇到的问题及解决方案【推荐】
Oct 29 Python
python输入整条数据分割存入数组的方法
Nov 13 Python
解决Python print输出不换行没空格的问题
Nov 14 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
深入理解Tensorflow中的masking和padding
Feb 24 Python
python打开音乐文件的实例方法
Jul 21 Python
Python如何将装饰器定义为类
Jul 30 Python
Python数据分析之pandas读取数据
Jun 02 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
利用yahoo汇率接口实现实时汇率转换示例 汇率转换器
2014/01/14 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
PHP经典设计模式之依赖注入定义与用法详解
2019/05/21 PHP
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
自动刷新网页,自动刷新当前页面,JS调用
2013/06/24 Javascript
Script标签与访问HTML页面详解
2014/01/10 Javascript
JavaScript获取网页、浏览器、屏幕高度和宽度汇总
2014/12/18 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
学习JavaScript设计模式之观察者模式
2020/04/22 Javascript
jQuery的promise与deferred对象在异步回调中的作用
2016/05/03 Javascript
EasyUI 中combotree 默认不能选择父节点的实现方法
2016/11/07 Javascript
jQuery和CSS仿京东仿淘宝列表导航菜单
2017/01/04 Javascript
微信小程序 navbar实例详解
2017/05/11 Javascript
利用Node.js检测端口是否被占用的方法
2017/12/07 Javascript
angular 实现的输入框数字千分位及保留几位小数点功能示例
2018/06/19 Javascript
element-ui 中的table的列隐藏问题解决
2018/08/24 Javascript
JavaScript实现预览本地上传图片功能完整示例
2019/03/08 Javascript
Python正则表达式完全指南
2017/05/25 Python
python利用socketserver实现并发套接字功能
2018/01/26 Python
django+echart绘制曲线图的方法示例
2018/11/26 Python
python匹配两个短语之间的字符实例
2018/12/25 Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
2019/06/21 Python
PyQt5根据控件Id获取控件对象的方法
2019/06/25 Python
对Python中一维向量和一维向量转置相乘的方法详解
2019/08/26 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
2020/03/17 Python
TensorFlow实现批量归一化操作的示例
2020/04/22 Python
ansible-playbook实现自动部署KVM及安装python3的详细教程
2020/05/11 Python
canvas之万花筒效果的简单实现(推荐)
2016/08/16 HTML / CSS
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上?
2013/03/30 面试题
安全生产一岗双责责任书
2014/07/28 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
乡镇领导班子四风对照检查材料
2014/09/27 职场文书
校园新闻广播稿5篇
2014/10/10 职场文书
地方白酒代理协议书
2014/10/25 职场文书
社会治安综合治理责任书
2015/01/29 职场文书
喜迎建国70周年:有关爱国的名言名句
2019/09/24 职场文书