首页 > 代码库 > 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 ‘99‘print(Su().score)
当调用的属性不存在时,比如score,python会试图调用__getattr__(self,‘score‘)来尝试获得属性,这样我们就有机会返回score的值
MyPython-->进阶篇-->定制类