首页 > 代码库 > MyPython-->进阶篇-->定制类

MyPython-->进阶篇-->定制类

多重继承

class Student(man,oldman):

  pass

可以继承多个父类,拥有他们的方法,如果有父类有相同的方法,哪个在前用哪个

定制类

看到类似__slots__这种形如 __xxx__的变量或函数名就要注意,这些在python中是有特殊用途的

我们已经知道了__slots__的用法,用__len__()方法我们也知道是为了能让class作用于len()函数

__str__

我们先定义一个Student类,打印一个实例

class Studentc():    def __init__(self,name):        self.__name = nameprint(Studentc(cc))
--> <__main__.Studentc object at 0x0000000000B48B00>

打印出来一坨不好看,我们定义一下__str__()方法,返回一个好看的字符串

class Studentc():    def __init__(self,name):        self.__name = name    def __str__(self):        return Studentc object (name : %s)% self.__nameprint(Studentc(cc)) #  Studentc object (name : cc)

这里return 不用敲print

但是直接敲变量在shell下运行,打印出来的还是不好看

>>> s = Student(‘Michael‘)>>> s<__main__.Student object at 0x109afb310>

这是因为直接显示变量调用的不是__str__(),而是__repr__(),两者的区别就是__str__()返回用户看到的字符串,而__repr__返回程序开发者看到的字符串,也就是说__repr__()是为调试服务的

解决办法是再定义一个__repr__()。但是通常两个代码是一样的,可以偷懒

class Studentc():    def __init__(self,name):        self.__name = name    def __str__(self):        return Studentc object (name : %s)% self.__name    __repr__ = __str__

__iter__

如果一个类想要被用于for in 循环,必须实现一个__iter__()方法,改方法返回一个迭代对象,然后就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环

class Fib():    def __init__(self):        self.__a,self.__b = 0,1    def __iter__(self):        return self    def __next__(self):        self.__a,self.__b = self.__b,self.__a + self.__b        if self.__a >1000:            raise StopIteration        else:            return self.__afor x in Fib():    print(x)

__getitem__

Fib实例虽然能作用于for循环,看起来和list有点像,但是,把它当成list使用还是不行比如取第五个元素

class Suv():    def __getitem__(self,n):        a,b = 0,1        for x in range(n):            a,b = b,a+b        return aprint(Fib()[3])

list还有切片功能,这里不能用,因为我们不知道传进来的是什么需要做一个判断

isinstance(n,slice) slice是切片的类型。还有负数等没有处理真想完全实现的话需要添加很多

__getattr__

正常情况下,当我们调用类的方法或属性时,如果不存在,就会报错

避免这种情况,除了可以加上一个score属性外,python还有另一个机智,那就是写一个__getattr__()方法,动态返回一个属性

class Su():    def __init__(self):        self.name = cc    def __getattr__(self, item):        if item == score:            return 99print(Su().score)

当调用的属性不存在时,比如score,python会试图调用__getattr__(self,‘score‘)来尝试获得属性,这样我们就有机会返回score的值

 

MyPython-->进阶篇-->定制类