BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1160|回复: 2

Python中的操作符重载 [转]

[复制链接]
发表于 2014-1-14 20:58:19 | 显示全部楼层 |阅读模式
http://www.crazyant.net/712.html

关于Python中的操作符重载,可以查看3.x文档地址:

http://docs.python.org/3/reference/datamodel.html#special-method-names

或者一篇详细的中文教程:

Python 魔术方法指南


# 类可以重载python的操作符,操作符重载使我们的对象与内置的一样。__X__的名字的方法是特殊的挂钩(hook),python通过这种特殊的命名来拦截操作符,以实现重载。 python在计算操作符时会自动调用这样的方法,例如:如果对象继承了__add__方法,当它出现在+表达式中时会调用这个方法。通过重载,用户定义的对象就像内置的一样。

# 在类中重载操作符

# 操作符重载使得类能拦截标准的python操作。
# 类可以重载所有的python的表达式操作符。
# 类可以重载对象操作:print,函数调用,限定等。
# 重载使得类的实例看起来更像内置的。
# 重载是通过特殊命名的类方法来实现的。
# 魔术方法、调用方式、解释:

__new__(cls [,...])
# instance = MyClass(arg1, arg2)
# __new__ 在创建实例的时候被调用

__init__(self [,...])
# instance = MyClass(arg1, arg2)
# __init__ 在创建实例的时候被调用

__cmp__(self, other)
# self == other, self > other, 等。
# 在比较的时候调用

__pos__(self)
# +self
# 一元加运算符

__neg__(self)
# -self
# 一元减运算符

__invert__(self)
# ~self
# 取反运算符

__index__(self)
# x[self]
# 对象被作为索引使用的时候

__nonzero__(self)
# bool(self)
# 对象的布尔值

__getattr__(self, name)
# self.name # name 不存在
# 访问一个不存在的属性时

__setattr__(self, name, val)
# self.name = val
# 对一个属性赋值时

__delattr__(self, name)
# del self.name
# 删除一个属性时

__getattribute__(self, name)
# self.name
# 访问任何属性时

__getitem__(self, key)
# self[key]
# 使用索引访问元素时

__setitem__(self, key, val)
# self[key] = val
# 对某个索引值赋值时

__delitem__(self, key)
# del self[key]
# 删除某个索引值时

__iter__(self)
# for x in self
# 迭代时

__contains__(self, value)
# value in self, value not in self
# 使用 in 操作测试关系时

__concat__(self, value)
# self + other
# 连接两个对象时

__call__(self [,...])
# self(args)
# “调用”对象时

__enter__(self)
# with self as x:
# with 语句环境管理

__exit__(self, exc, val, trace)
# with self as x:
# with 语句环境管理

__getstate__(self)
# pickle.dump(pkl_file, self)
# 序列化

__setstate__(self)
# data = pickle.load(pkl_file)
# 序列化



## 例子:

  1. # coding:utf-8

  2. #__getitem__拦截了所有的索引操作
  3. class Obj:
  4.     #重载操作符的写法,这里重载了下标操作符
  5.     def __getitem__(self,index):
  6.         return index ** 2

  7. #取得indexer的对象
  8. x = Obj()
  9. for i in range(5):
  10.     #x[i]将调用__getitem__(x,i)
  11.     print x[i]
复制代码

# 调用结果:
# 0
# 1
# 4
# 9
# 16



发表于 2018-7-10 15:21:22 | 显示全部楼层
你好,我是blender新新新手,最近在用blender构建三维物体,想把它作为模拟用的仿体引用到pycharm的仿真代码中,请教我该怎样实现?
回复 支持 反对

使用道具 举报

发表于 2018-7-10 20:26:31 | 显示全部楼层
blender新新新手请问,如何把在blender中构建的三维物体引用到pycharm的代码中?想把它作为pycharm模拟仿真的仿体......
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-3-22 09:05 , Processed in 0.016728 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表