码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2016-09-14 20:26:11      阅读:150      评论:0      收藏:0      [点我收藏+]

标签:

多重继承

class Student(man,oldman):

  pass

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

定制类

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

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

__str__

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

class Studentc():
    def __init__(self,name):
        self.__name = name
print(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.__name
print(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.__a
for 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 a
print(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-->进阶篇-->定制类

标签:

原文地址:http://www.cnblogs.com/notJoke/p/5873153.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!