首页 > 编程语言 > 详细

Python -- OOP高级 -- 定制类

时间:2015-10-22 12:12:14      阅读:268      评论:0      收藏:0      [点我收藏+]

 

__str____repr__ :实例对象直接显示字符串

class Student:
    def __init__(self, name):
        self.name = name
        
    def __str__(self):
        return "Name: %s" % self.name
    __repr__ = __str__

>>> s = Student("Zoro")

>>> s
Out[70]: Name: Zoro

# __str__()返回用户看到的字符串,而__repr__()返回程序开发者看到的字符串,也就是说,__repr__()是为调试服务的。

 


 

__iter__ __next__  : 实例对象能够用于迭代

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
        return self.a

>>> f = Fib()

>>> for i  in f:
...:     print(i, end=" ")
...:     
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 

# __iter__()方法返回一个迭代对象,然后Python的for循环就会不断调用该迭代对象的__next__()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

 


 

__getitem__ : 实例对象可以下标操作

class Fib:
    def __getitem__(self, n):
        a, b = 1, 1
        for i in range(n):
            a, b = b, a+b
        return a

>>> f = Fib()

>>> f[5]
Out[97]: 8

>>> for i in range(20):
    print(f[i], end=" ")
    
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765

 


 

__getattr__ : 访问不存在的属性时调用

class Student:
    def __getattr__(self, attr):
        if attr == "age":
            return 26
        raise AttributeError("‘Student‘ class has no attribute ‘%s!‘" % attr)

>>> s = Student()

>>> s.age
Out[117]: 26

>>> s.name
Traceback (most recent call last):
  File "<ipython-input-118-35e6ae75375b>", line 1, in <module>
    s.name
  File "C:/Users/SQD/Desktop/__getattr__.py", line 12, in __getattr__
    raise AttributeError("‘Student‘ class has no attribute ‘%s!‘" % attr)

AttributeError: Student class has no attribute name!
class Chain(object):
    def __init__(self, path=‘‘):
        self._path = path
    
    def __getattr__(self, path):
        return Chain("%s/%s" % (self._path, path))
    
    def __str__(self):
        return self._path
    __repr__ = __str__

>>> c = Chain()

>>> c.status.user.timeline.list
Out[130]: /status/user/timeline/list

 


 

__call__ : 直接对实例进行调用

class Student:
    def __init__(self, name):
        self._name = name
        
    def __call__(self):
        print("My name is %s" % self._name)

>>> s = Student("Zoro")

>>> s()
My name is Zoro

 

Python -- OOP高级 -- 定制类

原文:http://www.cnblogs.com/roronoa-sqd/p/4900293.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!