网站首页 >> 美食攻略 >> 正文
简介: 1、在Python中,魔术 *** (MagicMethods)是一种特殊的 *** ,它们以双下划线开头和结尾,如__init__、__str__等。这些 *** 允许定制类的行为,使得对象更具有灵

简单的魔术表演 Python中的魔术方法全解析

1、在Python中,魔术 *** (MagicMethods)是一种特殊的 *** ,它们以双下划线开头和结尾,如__init__、__str__等。这些 *** 允许定制类的行为,使得对象更具有灵活性和可定制性。本文将深入探讨Python中一些常用的魔术 *** ,以及如何使用它们来定制类与对象。

2、classPerson:\ndef__init__(self,name,age):\nself.name=name\nself.age=age\n\nperson=Person("Alice",30)\nprint(person.name,person.age)\n

__init__ *** 在对象创建时被调用,用于初始化对象的属性。上述例子展示了一个简单的Person类,通过__init__ *** 初始化了姓名和年龄属性。

3、classPerson:\ndef__init__(self,name,age):\nself.name=name\nself.age=age\n\ndef__str__(self):\nreturnf"{self.name},{self.age}yearsold"\n\nperson=Person("Alice",30)\nprint(person)\n

__str__ *** 定义了对象的字符串表示形式,可以通过print函数直接输出对象。在上述例子中,Person类通过__str__ *** 返回一个描述人物信息的字符串。

4、classPlaylist:\ndef__init__(self,songs):\nself.songs=songs\n\ndef__len__(self):\nreturnlen(self.songs)\n\nplaylist=Playlist(["Song1","Song2","Song3"])\nprint(len(playlist))\n

__len__ *** 用于定义对象的长度,使得对象可以被内置函数len调用。在上述例子中,Playlist类通过__len__ *** 返回歌单中歌曲的数量。

5、classShoppingCart:\ndef__init__(self):\nself.items={}\n\ndef__getitem__(self,product):\nreturnself.items.get(product,0)\n\ndef__setitem__(self,product,quantity):\nself.items[product]=quantity\n\ncart=ShoppingCart()\ncart["apple"]=3\ncart["banana"]=2\nprint(cart["apple"])\n

通过__getitem__和__setitem__ *** ,可以定制对象的索引和切片操作。在上述例子中,ShoppingCart类模拟了一个购物车,通过这两个魔术 *** 实现了对商品数量的管理。

6、classCountdown:\ndef__init__(self,start):\nself.start=start\n\ndef__iter__(self):\nreturnself\n\ndef__next__(self):\nifself.start<=0:\nraiseStopIteration\nelse:\nself.start-=1\nreturnself.start+1\n\ncountdown=Countdown(5)\nfornumincountdown:\nprint(num)\n

通过__iter__和__next__ *** ,可以使对象变成可迭代的。在上述例子中,Countdown类通过这两个魔术 *** 实现了从初始值倒数到1的功能。

7、classMultiplier:\ndef__init__(self,factor):\nself.factor=factor\n\ndef__call__(self,x):\nreturnx*self.factor\n\ndouble=Multiplier(2)\nresult=double(5)\nprint(result)\n

__call__ *** 使得对象可以被调用,就像函数一样。在上述例子中,Multiplier类通过__call__ *** 实现了对数字的乘法操作。

8、classBook:\ndef__init__(self,title,author):\nself.title=title\nself.author=author\n\ndef__eq__(self,other):\nreturnself.title==other.titleandself.author==other.author\n\ndef__ne__(self,other):\nreturnnotself.__eq__(other)\n\nbook1=Book("PythonCrashCourse","EricMatthes")\nbook2=Book("PythonCrashCourse","EricMatthes")\nprint(book1==book2)\n

通过__eq__和__ne__ *** ,可以定制对象的相等性比较。在上述例子中,Book类通过这两个魔术 *** 实现了对书籍对象的相等性判断。

9、classLogger:\ndef__getattr__(self,name):\nprint(f"Accessedundefinedattribute:{name}")\nreturnNone\n\ndef__setattr__(self,name,value):\nprint(f"Setattribute:{name}={value}")\nsuper().__setattr__(name,value)\n\nlogger=Logger()\nlogger.undefined_attribute#触发__getattr__\nlogger.new_attribute="NewValue"#触发__setattr__\n

通过__getattr__和__setattr__ *** ,可以定制对象的属性访问和赋值操作。在上述例子中,Logger类通过这两个魔术 *** 实现了对未定义属性的访问提示和对属性赋值的监控。

10、classTimer:\ndef__enter__(self):\nself.start_time=time.time()\nreturnself\n\ndef__exit__(self,exc_type,exc_value,traceback):\nself.end_time=time.time()\nelapsed_time=self.end_time-self.start_time\nprint(f"Timeelapsed:{elapsed_time}seconds")\n\nwithTimer()astimer:\n#执行一些耗时操作\ntime.sleep(2)\n

通过__enter__和__exit__ *** ,可以定制对象的上下文管理行为,使得对象可以被用于with语句中。在上述例子中,Timer类通过这两个魔术 *** 实现了计时器的功能。

11、classMyClass:\ndef__del__(self):\nprint("Objectdeleted")\n\nobj=MyClass()\ndelobj#触发__del__\n

__del__ *** 定义了对象被销毁时的行为。在上述例子中,MyClass类通过__del__ *** 实现了在对象被删除时输出一条消息。

12、本文深入探讨了Python中的魔术 *** ,这些以双下划线开头和结尾的特殊 *** 赋予了开发者在类和对象中进行更深层次的定制的能力。学习了多个魔术 *** 的用法,如__init__用于初始化对象,__str__用于定制字符串表示,__len__用于定义对象的长度,以及__getitem__和__setitem__用于定制索引和切片等操作。

13、通过实例代码,演示了如何通过魔术 *** 实现更具可读性和可维护性的代码。讨论了魔术 *** 在创建可迭代对象、实现上下文管理、自定义相等性比较等方面的应用,展示了它们在不同场景中的灵活性和实用性。

14、此外,强调了使用魔术 *** 时的一些建议,例如在__eq__和__ne__中定义对象的相等性比较,以及通过__enter__和__exit__实现上下文管理。这些技巧有助于开发者更好地理解和运用魔术 *** ,使得代码更加符合Pythonic的编程风格。

15、总体而言,深入理解和熟练运用Python中的魔术 *** 将提升在面向对象编程方面的技能水平,使得能够更富创造力地定制类与对象,写出更加强大而优雅的Python代码。

网友点评

博博常识网

博博常识网

www.kissing2lips.com

日常生活里,经常会碰到一些五花八门的小困难。不过好久好在有困难就有方法,如果你足够的细心,你会发现这些小困难都有着对应的小方法。

Powered By Z-BlogPHP Theme By . 鲁ICP备2021032584号-5