社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python中一些特殊方法的自定义及作用

yunson • 8 年前 • 757 次点击  

原文连接

引言

   聊一聊__add__,__mul__,__len__,__bool__的作用和自定义,以及__len__和
   __bool__是怎么影响if/while的条件判断,另外说一说怎么把一个对象以字符串的
   形式表现。

<!--more-->

自定义运算符

使用场景

    自定义一个类, 类中有两个属性分别为xy, 实现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举例,
我想你总不希望当xy都是0的时候还希望if v成立吧

关于bool()

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

实现

boollen都没有

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

boollen都有

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)

    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

如何使对象以字符串的形式表现

为什么要以字符串的形式

我们把一个对象以字符串的形式表现出来,是为了更好的辨认,方便后续处理或让用户觉得更加直观,
最普遍的是在djangoadmin中,我们希望看到一行数据的谁的数据,而不是希望看到一个class
或其他无法辨识的表现形式。

原文连接

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/2461
 
757 次点击