zoukankan      html  css  js  c++  java
  • Python -- OOP高级 -- 定制类


    __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
    KEEP LEARNING!
  • 相关阅读:
    Oracle常用命令
    Infobright 数据仓库
    ORACLE RMAN备份及还原
    将数据库转换为归档日志模式
    Oracle SCN详解
    Android中Intent与Bundle 在传值时有什么不同
    如何让自定义Dialog上下居中
    activity中onResume()的用处
    TabHost 两种使用方法 直接让一个Activity 继承TabActivity 和 利用findViwById()方法取得TagHost组件
    豌豆荚进程与adb端口冲突
  • 原文地址:https://www.cnblogs.com/roronoa-sqd/p/4900293.html
Copyright © 2011-2022 走看看