python魔法方法-属性转换和类的意味详解,python详解

将字符串转换到,整型,从字面通晓很不难令人误会。

python魔法方法-属性转换和类的代表详解,python详解

类型转换魔法

类型转换魔法其实就是完毕了str、int等工厂函数的结果,经常这个函数还有类型转换的意义,下边是局地连锁的魔法方法:

•__int__(self)

•转换来整型,对应int函数。

•__long__(self)

•转换到长整型,对应long函数。

•__float__(self)

•转换来浮点型,对应float函数。

•__complex__(self)

•转换成 复数型,对应complex函数。

•__oct__(self)

•转换来八进制,对应oct函数。

•__hex__(self)

•转换到十六进制,对应hex函数。

•__index__(self)

•首先,这么些主意应该回到3个整数,能够是int只怕long。这么些措施在四个地点有效,首先是
operator
模块中的index函数获得的值正是这么些情势的重回值,其次是用于切片操作,上边会特意开始展览代码演示。

•__trunc__(self)

•当 math.trunc(self) 使用时被调用.__trunc__再次来到本人类型的整型截取
(常常是多少个长整型).

•__coerce__(self, other)

•达成了项目标强制转换,这么些点子对应于 coerce
内建函数的结果(python3.0起初去掉了此函数,也便是该魔法方法也没意义了,至于后续的本子是还是不是重新参预球协会助,要视官方而定。)

•这么些函数的作用是强制性地将五个不等的数字类型转换来为同1个类型,例如:

图片 1

措施再次来到三个元祖,分别对应转换后的五个数字。其事先级为:复数>浮点数>长整型>整型。在更换的时候,会转换为多个参数中先行级高的门类。当转换不能到位的时候,会触发
TypeError。

而当大家定义这些魔法方法时,假使转换不可能到位,应该回到None。

那边有个十分重要的建制,当python举行演算的时候,如 1 + 1.0 时,会先调用
coerce 函数将其更换为同一个档次,然后再拓展运行,那也便是为啥 1 + 1.0
= 2.0,因为更换之后实际进行的演算为 1.0
+1.0。获得这么的结果也就不意外了。

代码示例:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __int__(self):
    return int(self.x) + 1

  def __long__(self):
    return long(self.x) + 1

a = Foo(123)
print int(a)
print long(a)
print type(int(a))
print type(long(a))

图片 2

此地要小心一点,魔法方法的重返值必须符合预期,例如 __int__
就应该回到3个 int
类型,借使大家随便地赶回其余项目,例如字符串(str)、列表(list)等,会报错。

def __int__(self):
    return str(self.x)

图片 3

def __int__(self):
    return list(self.x)

图片 4

只是 int 能够回来 long,而 long 再次回到 int 时会自动被拍卖成 long:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __int__(self):
    return long(self.x) + 1

  def __long__(self):
    return int(self.x) + 1

a = Foo(123)
print int(a)
print long(a)
print type(int(a))
print type(long(a))

图片 5

上述发生在python2.7.11上,那是3个很意外的行为,以至于作者觉着其大概是一个BUG,总之大家在使用的时候要专注要回到对应的品种就是了,以防出错。

__index__(self):

首先是对应于operator.index(),operator.index(a)就一定于a.__index__():

import operator

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return self.x + 1

a = Foo(10)
print operator.index(a)

图片 6

另三个是很神奇的特效,当其用于系列中时:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return 3

a = Foo('scolia')
b = [1, 2, 3, 4, 5]
print b[a]
print b[3]

图片 7

能够作为目录一样选择,可进展切开操作:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __index__(self):
    return int(self.x)

a = Foo('1')
b = Foo('3')
c = [1, 2, 3, 4, 5]
print c[a:b]

 图片 8

骨子里切片内部使用的函数 slice
对其展开了处理,有趣味的校友能够去打听那些函数:

a = Foo('1')
b = Foo('3')
c = slice(a, b)
print c
d = [1, 2, 3, 4, 5]
print d[c]

 __coerce__(self, other):

代码示例:

class Foo(object):
  def __init__(self, x):
    self.x = x

  def __coerce__(self, other):
    return self.x, str(other.x)

class Boo(object):
  def __init__(self, x):
    self.x = x

  def __coerce__(self, other):
    return self.x, int(other.x)

a = Foo('123')
b = Boo(123)
print coerce(a, b)
print coerce(b, a)

图片 9

 计算:是调用了第二个参数的魔法方法。

类的象征 :

类的表示其实正是对外的性状,例如使用print语句时,打字与印刷出来的是什么,其实本质上也是对应函数的输出:

•__str__(self)

•定义当 str()
被您的3个类的实例调用时所要产生的一坐一起。因为print暗中同意调用的就是str()函数。

•__repr__(self)

•定义当 repr()  被你的二个类的实例调用时所要产生的一坐一起。 str() 和 repr()
的要紧差别是其目的群众体育。 repr() 重回的是机械可读的出口,而 str()
再次回到的是全人类可读的。  repr() 函数是换来情势暗中同意调用的

•函数。

•__unicode__(self)

•定义当 unicode() 被您的3个类的实例调用时所要爆发的行事。 unicode() 和
str() 很相似,可是回到的是unicode字符串。注意,倘使对你的类调用 str()
然则你只定义了 __unicode__() ,那么其将不会

•工作。你应该定义 __str__()
来确认保障调用时能回去正确的值,并不是种种人都有情怀去行使unicode()。

•__format__(self, formatstr)

•定义当您的多个类的实例被用来用新式的格式化字符串方法进行格式化时所要产生的行为。例如,
“Hello, {0:abc}!”.format(a) 将会导致调用 a.__format__(“abc”)
。这对定义你自个儿的数值或字符串类型

•是这二个有含义的,你恐怕会交到一些奇特的格式化选项。

•__hash__(self)

•定义当
hash()被你的一个类的实例调用时所要爆发的表现。它必须重临2个整数,用来在字典中开始展览急速比较。

•请注意,实现__hash__时平时也要贯彻__eq__。有下边那样的平整:a
== b 暗示着 hash(a) == hash(b) 。约等于说八个魔法方法的重回值最佳同一。

•那里引入三个‘可哈希对象’的定义,首先三个可哈希对象的哈希值在其生命周期内应有是不变的,而要得到哈希值就象征要贯彻__hash__主意。而哈希对象时期是足以比较的,那表示要兑现__eq__或

•者__cmp__形式,而哈希对象相等必须其哈希值相等,要促成这些天性就象征__eq__的再次回到值必须和__hash__一样。

•可哈希对象可以看成字典的键和集合的分子,因为那几个数据结构内部使用的便是哈希值。python中存有内置的不变的对象都以可哈希的,例如元组、字符串、数字等;而可变对象则无法哈希,例如列表、

•字典等。

•用户定义的类的实例默许是可哈希的,且除了它们本身以外哪个人也不等于,因为其哈希值来自于
id 函数。但那并不代表 hash(a) == id(a),要留心这么些性情。

•__nonzero__(self)

•定义当 bool()
被您的二个类的实例调用时所要产生的行为。本办法应该回到True或然False,取决于你想让它回到的值。(python3.x中改为__bool__)

•__dir__(self)

•定义当 dir()
被你的七个类的实例调用时所要产生的作为。该格局应该回到2特品质的列表给用户。

•__sizeof__(self)

•定义当 sys.getsizeof()
被你的3个类的实例调用时所要产生的作为。该措施应该以字节为单位,再次回到您的对象的轻重。那平时对于以C扩张的款型达成的Python类尤其有意义,其推进领会那一个扩充。

此间并从未什么样越发麻烦理解的地方,所以代码例子就略去了。

以上那篇python魔法方法-属性转换和类的表示详解就是笔者分享给大家的全体内容了,希望能给大家八个参阅,也指望我们多多援助帮客之家。

类型转换魔法
类型转换魔法其实正是实现了str、int等工厂函数的结果,日常那一个函数还…

 

python学习3群:563227894

 

那正是说大家就接纳不能变换的情景,会报类型错误来写这几个函数。

贯彻:即使得以转换到,int型直接反回转换后的值,就算不可能转换,反回False

 

D:\Python27\python.exe D:/HttpRunnerManager-master/HttpRunnerManager-master/test.py
False
False
12
234
False

比如,要把那几个”abcabc”转换来整型,臣妾做不到啊。除成转成ascii。

def to_int(str):
    try:
        int(str)
        return int(str)
    except ValueError: #报类型错误,说明不是整型的
        try:
            float(str) #用这个来验证,是不是浮点字符串
            return int(float(str))
        except ValueError:  #如果报错,说明即不是浮点,也不是int字符串。   是一个真正的字符串
            return False
print to_int('str')
print to_int('str123')
print to_int('12.12')
print to_int('234')
print to_int('12#$%%')

相关文章