首页 > 编程语言 >python 魔术方法

python 魔术方法

时间:2023-05-04 17:15:21浏览次数:42  
标签:__ python self 魔术 other 对象 方法 def

在Python中,魔术方法(也称为特殊方法或双下划线方法)是一组预定义的方法,它们被用于在类中实现特定的行为。这些方法以两个下划线开头和结尾,例如__init__()__str__()

以下是几个常见的魔术方法及其作用:

  • __init__(): 用于初始化类的实例。当创建类对象时,这个方法会自动调用。
  • __str__(): 定义打印类对象时要输出的字符串表示形式。默认情况下,如果没有定义该方法,则输出对象的内存地址。
  • __len__(): 定义获取对象长度的方式。例如,在列表、元组等容器中使用。

让我们来看一个生活中的例子:假设你正在制作一个电子商务网站并需要编写一个名为“Product”的类来代表一个产品。你可以使用以下魔术方法:

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price
    
    def __str__(self):
        return f"{self.name} - ${self.price}"
    
    def __eq__(self, other):
        return self.name == other.name and self.price == other.price

上述代码中,__init__() 方法用于在创建类对象时初始化名称和价格属性。__str__() 方法定义了类对象的字符串表示形式,以便在需要打印产品信息时可以直接输出。__eq__() 方法比较两个产品对象是否相等,以便在需要进行比较时可以直接使用运算符 ==

因此,在生活中,魔术方法就像是在类中添加了一些特殊的行为和功能,使得我们能够更方便地使用这些对象。

除了上述常见的魔术方法,Python还提供了许多其他有用的魔术方法,例如:

  • __getitem__(): 控制对象的索引操作。当我们通过obj[key]方式访问对象时,自动调用此方法。
  • __setitem__(): 控制对象的赋值操作。当我们通过obj[key] = value方式为对象赋值时,自动调用此方法。
  • __call__(): 让对象能够像函数一样被调用。当我们使用obj()调用对象时,自动调用此方法。

下面是一个例子,展示了如何实现__getitem__()__setitem__()方法:

class MyList:
    def __init__(self, *args):
        self.items = list(args)
        
    def __getitem__(self, index):
        return self.items[index]
    
    def __setitem__(self, index, value):
        self.items[index] = value

上述代码中,我们定义了一个名为“MyList”的类,并在其构造函数中初始化列表属性。我们还定义了__getitem__()__setitem__()方法,以便我们可以像使用列表一样使用这个类的对象。

例如,如果我们创建一个MyList对象,并对其进行索引和修改:

my_list = MyList(1, 2, 3, 4, 5)
print(my_list[2]) # 输出: 3
my_list[2] = 100
print(my_list[2]) # 输出: 100

下面是一些常用的运算符重载方法:

  • __add__(): 重载“+”运算符。当两个对象相加时自动调用此方法。
  • __sub__(): 重载“-”运算符。当两个对象相减时自动调用此方法。
  • __mul__(): 重载“*”运算符。当两个对象相乘时自动调用此方法。
  • __truediv__(): 重载“/”运算符。当两个对象相除时自动调用此方法。
  • __eq__(): 重载“==”运算符。当两个对象进行等值比较时自动调用此方法。

以下是一个例子,展示了如何实现运算符重载:

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        
    def __add__(self, other):
        return Point(self.x + other.x, self.y + other.y)
    
    def __sub__(self, other):
        return Point(self.x - other.x, self.y - other.y)
    
    def __mul__(self, scalar):
        return Point(self.x * scalar, self.y * scalar)
    
    def __truediv__(self, scalar):
        return Point(self.x / scalar, self.y / scalar)
    
    def __eq__(self, other):
        return self.x == other.x and self.y == other.y

上述代码中,我们定义了一个名为“Point”的类,表示二维平面上的点。我们重载了加、减、乘、除和等值比较运算符,并实现了相应的魔术方法。

以下是一个使用我们实现的类的例子:

p1 = Point(1, 2)
p2 = Point(3, 4)

# 加法操作
p3 = p1 + p2
print(p3.x, p3.y) # 输出: 4, 6

# 减法操作
p4 = p1 - p2
print(p4.x, p4.y) # 输出: -2, -2

# 乘法操作
p5 = p1 * 2
print(p5.x, p5.y) # 输出: 2, 4

# 除法操作
p6 = p1 / 2
print(p6.x, p6.y) # 输出: 0.5, 1.0

# 等值比较操作
print(p1 == p2) # 输出: False
print(p1 == Point(1, 2)) # 输出: True

 

标签:__,python,self,魔术,other,对象,方法,def
From: https://www.cnblogs.com/yund/p/17371849.html

相关文章

  • 线程常用的方法(线程中断)
         ......
  • 该方法实现网页编码的自动识别和转换
    """该方法实现网页编码的自动识别和转换"""#python第三方库chardet不可靠,把gbk编码解析成Windows-1254@retry(stop_max_attempt_number=5,wait_random_min=2000,wait_random_max=20000,)defpage_trancode(content):codes=chardet.detect(content)ifcodes[&......
  • Python保留两位小数五种常用的方法!
    在Python中,保留两位小数是我们经常会碰到的问题,也是比较常见的需求之一。那么Python中如何保留两位小数?Python保留两位小数的方法有很多种,具体请看下文。1、使用字符串格式化大部分语言都可以使用字符串格式化的方法来实现保留两位小数,Python也不例外。a=12.345......
  • 【解决方法】解决锐捷EVE模拟器无法弹出选择CRT接管命令行和命令行,提示:此站点正在尝试
    环境:工具:锐捷EVE模拟器,火狐游览器(Firefox)远程工具:SecureCRT系统版本:Windows10问题描述:描述:在Edge游览器和360游览器中,启动路由器等设备无法启动命令行和CRT,弹出框中无反应。如下图:解释:游览器不兼容,安装火狐游览器即可。解决方法:1.下载火狐游览器:https://www.firefo......
  • python 闭包、偏函数、数据锁定
    闭包(Closure)是指在一个函数内部定义另外一个函数,并且这个内部函数可以访问外部函数中的变量。通常情况下,当外部函数执行完毕后,局部变量会被销毁,但是闭包可以使得外部函数执行完毕后,其内部函数仍然可以访问外部函数的局部变量。比如下面这个例子:defouter(x):definner(y):......
  • python 多态
    在Python3中,多态是指同一个方法或者操作可以在不同的对象上产生不同的行为或结果。这意味着一个函数可以接受不同类型的参数,并且可以表现出不同的行为。生活中的例子如下:假设你想要买一台新电视机,你可能会去电器店看看有哪些电视可供选择。当你开始比较价格和功能时,你可能会发......
  • SDN Python编程创建多数据中心网络
    首先开启OpenDaylightcd/home/ubuntu/karaf-0.7.1/bin/./karaf新开一个终端执行以下操作在/home/ubuntu/mininet/examples目录下新建一个sdn4.py文件输入以下代码frommininet.topoimportTopoclassMyTopo(Topo):def__init__(self):Topo.__init......
  • python 迭代器和推导式的不同处
    迭代器和推导式都是在Python中用于处理可迭代对象的机制,但它们之间有一些关键区别。返回值类型不同:推导式返回一个新的数据结构(列表、集合、字典等),而迭代器返回一个迭代器对象。推导式生成的是一个新的序列或集合,而迭代器则是逐个生成元素。实现方式不同:推导式是一种高级语......
  • Python时间模块time
    时间模块-time#time()获取本地时间戳#ctime()获取本地时间字符串(参数是时间戳,默认当前)#localtime()获取本地时间元组(参数是时间戳,默认当前)#mktime()通过时间元组获取时间戳(参数是时间元组)#asctime()通过时间元组获取时......
  • python 推导式
    在Python中,列表推导式、字典推导式和集合推导式都是常见的推导式。它们可以让我们使用一种简洁而强大的语法来快速创建新的序列或映射数据类型。列表推导式列表推导式是最常见的一种推导式,用于通过对一个序列中的每个元素应用一个表达式来快速生成一个新的列表。列表推导式的......