暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

python中算术运算符和自定义bool值

技术and生活 2021-07-19
681

引言

本文简单介绍一下__add__,__mul__,__len__,__bool__的作用和定义,希望对于python刚入门的同学有帮助

自定义运算符

使用场景

  • 自定义一个类, 类中有两个属性分别为x和y, 实现a+b  a*b的功能,要求a+b实现a.x+b.x  a.y+b.y; a*b实现a.x*b.x a.y*b.y


实现

class V(object):


        def __init__(self, x, y):

            self.x = x

            self.y = y


        def __add__(self, v):

            print('run __add__')

            return V(x=v.x + self.x, y=v.y + self.y)


        def __mul__(self, v):

            print('run __mul__')

            return V(x=v.x * self.x, y=v.y * self.y)



    v = V(1, 2)

    print('---------------add----------')

    new_v = v + v

    print(new_v.x)


    print('---------------mul----------')

    new_v = v * v

    print(new_v.y)


自定义bool值

关于if v

默认情况下我们自己定义的类的实例总是被认为时真的,但是有的时候这个默认值不是我们想要的,除非我们自己定义__bool__或者__len__才能实现我们想要的结果,我们还以刚才的类V举例,我想你总不希望当x和y都是0的时候还希望if v成立吧

关于bool()

像if v/if not v等,python会调用bool(v)方法,而bool(v)背后的调用时尝试调用v.__bool__(),如果没有__bool__方法,就会尝试调用__len__方法,若这是返回0则是False否则为True,这两个方法都没有的话只能按照默认处理了

实现

__bool__和__len__都没有


class V(object):


    def __init__(self, x, y):

        self.x = x

        self.y = y


v = V(1, 2)


print('--------------if----------')

if v:

    print('\tif True')

else:

    print('\tif False')


print('-------------while----------')

while v:

    print('\twhile True')

    break

    

执行结果:

--------------if----------

    if True

-------------while----------

    while True



只有__len__


class V(object):


    def __init__(self, x, y):

        self.x = x

        self.y = y


    def __len__(self):

        print('run __len__')

        return self.x + self.y


v = V(1, 2)


print('--------------if----------')

if v:

    print('\tif True')

else:

    print('\tif False')


print('-------------while----------')

while v:

    print('\twhile True')

    break


执行结果:

--------------if----------

run __len__

   if True

-------------while----------

run __len__

    while True


__bool__与__len__都有


class V(object):


    def __init__(self, x, y):

        self.x = x

        self.y = y


    def __bool__(self):

        print('run __bool__')

        # 显然以下代码可以使if v效率更高

        return bool(self.x or self.y)


    # 可以通过调用len(v)来使__len__生效

    def __len__(self):

        print('run __len__')

        return self.x + self.y


v = V(1, 2)


print('--------------if----------')

if v:

    print('\tif True')

else:

    print('\tif False')


print('-------------while----------')

while v:

    print('\twhile True')

    break


执行结果:

--------------if----------

run __bool__

   if True

-------------while----------

run __bool__

    while True

文章转载自技术and生活,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论