__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))
以下是结果,可以看到打开函数时把字号调大了,关上时又调小了