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!
  • 相关阅读:
    适用于小白的 python 快速入门教程
    Centos7.x & RedHat7.x系统忘记 root 密码解决办法
    让我来教你如何免费使用RHEL小红帽系统
    10#Windows注册表的那些事儿
    9#搭建网站
    8#继承和多态
    7#Java基本语句语法
    6#day2总结
    5#关于数据数值的转换
    .NET Core开发日志——配置
  • 原文地址:https://www.cnblogs.com/roronoa-sqd/p/4900293.html
Copyright © 2011-2022 走看看