【python】Special Methods魔方方法

__init__

初始化一个对象

__str__

定义打印出来的样子。print(object)

__repr__

定义直接输出的样子

__eq__

定义两个不同的对象是否相等

__lt__

定义一个list的对象如何排序

example

class Dog:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def is_puppy(self):
        return self.age < 2

    def speak(self):
        if self.age > 10:
            print(self.name + ": grrrr")
        elif self.is_puppy():
            print(self.name + ": " + "bark! " * 10)
        else:
            print(self.name + ": bark")
            
    def __str__(self):
        return "Dog {}, Age={}".format(self.name, self.age)
    
    def __repr__(self):
        return "Dog('{}', {})".format(self.name, self.age)
    
    def _repr_html_(self):
        return "<h1><i>{}</i> the dog</h1>".format(self.name)
    
    def __eq__(self, other_dog):
        return (self.name == other_dog.name
                and self.age == other_dog.age)
    
    def __lt__(self, other_dog):
        return self.age < other_dog.age

v2测试eq:return true,保留其他代码把eq函数注释掉会返回false
v3测试lt:返回true,保留其他代码把lt函数注释掉会报错

fido = Dog("Fido", 11)
fido_v2 = Dog("Fido", 11)
fido == fido_v2

fido_v3 = Dog("Fido", 7)
fido > fido_v3

测试repr_html,直接输出sam,会显示大写加粗的Sam the dog
保留其他代码把repr_html函数注释,会显示repr函数的Dog(‘Sam’, 5)
测试str,print(sam)会显示出*[Dog(‘Sam’, 5), Dog(‘Fido’, 11)]*

sam = Dog("Sam", 5)
sam 
print(sam)

__len__

定义长度

__getitem__

定义切片循环功能

example

class Range:
    def __init__(self, bound1, bound2=None):
        if bound2 != None:
            self.lower = bound1
            self.upper = bound2
        else:
            self.lower = 0
            self.upper = bound1
            
    def __len__(self):
        return self.upper - self.lower
            
    def __getitem__(self, lookup):
        print("TYPE:", type(lookup))
        if not isinstance(lookup, int):
            raise NotImplementedError("slices not supported")
        if lookup < 0:
            raise NotImplementedError("negative not supported")
        if lookup >= len(self):
            raise IndexError("out of bounds")
        return self.lower + lookup

测试len:输出5

r1 = Range(5, 10)
len(r1)

测试getitem

r1[:3] #报错:NotImplementedError: slices not supported
r1[4] #输出9
r1[5]#报错:IndexError: out of bounds
for i in Range(5, 7):
    print(i)
####输出如下#####
TYPE: <class 'int'>
5
TYPE: <class 'int'>
6
TYPE: <class 'int'>

__enter__ __exit__

文本管理

#类似可以使用这种形式
with open("file.txt") as f:
 data = f.read()
# automatically close
import matplotlib
from matplotlib import pyplot as plt
class MultFont:
    def __init__(self, mult):
        self.mult = mult
    
    def __enter__(self):
        self.prior_size = matplotlib.rcParams["font.size"]
        matplotlib.rcParams["font.size"] *= self.mult
        
    def __exit__(self, exc_type, exc_value, traceback):
        matplotlib.rcParams["font.size"] = self.prior_size*0.5

plt.subplots(figsize=(1.5,1.5))
with MultFont(2):
    plt.subplots(figsize=(1.5,1.5))

plt.subplots(figsize=(1.5,1.5))

以下是结果,可以看到打开函数时把字号调大了,关上时又调小了
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值