定制类
python
定制类主要是实现特定功能,通过在类中定义特定的函数完成特定的功能。
1 | class Student(object): |
__str__用法
1 | class Student(object): |
实现__str__
函数,可以在print类对象时打印指定信息
通过实现__iter__
和__next__
同样可以使类对象产生可迭代序列,下面实现了斐波那契数列
1 | class Fib(object): |
__iter__
返回一个可迭代对象,这里我们返回了Fib自己的对象。__next__
是根据迭代器返回每一个迭代的序列,这里实现了运算规则,返回对象的a成员。
打印输出
1 | for n in Fib(): |
__getitem__用法
可以实现__getitem__
函数,这样就可以按照索引访问类对象中迭代元素了。
1 | class OddNum(object): |
1 | for n in OddNum(): |
可以进一步完善OddNum类的__getitem__
函数,使其支持切片处理
1 | def __getitem__(self, n): |
可通过如下方式调用print(oddnum[1:4])
__getattr__用法
通过实现__getattr__
函数,可以在类对象中没有某个属性时,自动调用__getattr__
函数
实现__call__
函数,可以实现类对象的函数式调用
1 | def __getattr__(self,attr): |
定制类案例
下面是一个链式转化例子,用到了这些特定函数
1 | class Chain(object): |
__repr__表示一个对象的字符串显示,当我们打印这个对象时,如果没有实现__str__函数,则会调用__repr__函数。
另外,当我们打印datetime对象时,可以看到__repr__相比__str__目标更具有准确性,__str__目标在于可读性。
另外,在迭代器迭代打印的时候默认调用的是对象的__repr__函数。
所以在我们实现了__str__方法后,基本也会将其赋值给__repr__函数。
具体的参考连接https://www.cnblogs.com/miaoning/p/11399575.html
因为我们定义了__getattr__函数,所以当属性不存在时就会构造一个新的对象返回,返回的对象拼接了之前的path信息和attr属性。
我们定义了users函数,这样可以调用users函数了。但是我们可以用更简洁的办法实现各种函数的调用而不用定义他们,就是通过实现__call__函数,这样就可以实现链式调用。
1 | class Chain(object): |
当调用users(‘michael’)时,因为没有定义users函数,所以会调用__getattr__函数,进而构造一个新的Chain对象。因为实现了__call__函数,所以这个对象可以被当作函数来使用,也就是Chain(‘michael’)的方式。
enum枚举
python同样支持枚举
操作
1 | from enum import Enum |