zoukankan      html  css  js  c++  java
  • python基础---- __getattribute__----__str__,__repr__,__format__----__doc__----__module__和__class__

    目录:

    一、 __getattribute__

    二、__str__,__repr__,__format__

    三、__doc__

    四、__module__和__class__

    一、 __getattribute__                                                               

     1 class Foo:
     2     def __init__(self,x):
     3         self.x=x
     4 
     5     def __getattr__(self, item):
     6         print('执行的是我')
     7         # return self.__dict__[item]
     8 
     9 f1=Foo(10)
    10 print(f1.x)
    11 f1.xxxxxx #不存在的属性访问,触发__getattr__
    12 
    13 回顾__getattr__
    回顾__getattr__
     1 class Foo:
     2     def __init__(self,x):
     3         self.x=x
     4 
     5     def __getattribute__(self, item):
     6         print('不管是否存在,我都会执行')
     7 
     8 f1=Foo(10)
     9 f1.x
    10 f1.xxxxxx
    11 
    12 __getattribute__
    __getattribute__
     1 #_*_coding:utf-8_*_
     2 __author__ = 'Linhaifeng'
     3 
     4 class Foo:
     5     def __init__(self,x):
     6         self.x=x
     7 
     8     def __getattr__(self, item):
     9         print('执行的是我')
    10         # return self.__dict__[item]
    11     def __getattribute__(self, item):
    12         print('不管是否存在,我都会执行')
    13         raise AttributeError('哈哈')
    14 
    15 f1=Foo(10)
    16 f1.x
    17 f1.xxxxxx
    18 
    19 #当__getattribute__与__getattr__同时存在,只会执行__getattrbute__,除非__getattribute__在执行过程中抛出异常AttributeError
    20 
    21 二者同时出现
    二者同时出现

    二、__str__,__repr__,__format__                                           

    改变对象的字符串显示__str__,__repr__

    自定制格式化字符串__format__

     1 #_*_coding:utf-8_*_
     2 __author__ = 'Linhaifeng'
     3 format_dict={
     4     'nat':'{obj.name}-{obj.addr}-{obj.type}',#学校名-学校地址-学校类型
     5     'tna':'{obj.type}:{obj.name}:{obj.addr}',#学校类型:学校名:学校地址
     6     'tan':'{obj.type}/{obj.addr}/{obj.name}',#学校类型/学校地址/学校名
     7 }
     8 class School:
     9     def __init__(self,name,addr,type):
    10         self.name=name
    11         self.addr=addr
    12         self.type=type
    13 
    14     def __repr__(self):
    15         return 'School(%s,%s)' %(self.name,self.addr)
    16     def __str__(self):
    17         return '(%s,%s)' %(self.name,self.addr)
    18 
    19     def __format__(self, format_spec):
    20         # if format_spec
    21         if not format_spec or format_spec not in format_dict:
    22             format_spec='nat'
    23         fmt=format_dict[format_spec]
    24         return fmt.format(obj=self)
    25 
    26 s1=School('oldboy1','北京','私立')
    27 print('from repr: ',repr(s1))
    28 print('from str: ',str(s1))
    29 print(s1)
    30 
    31 '''
    32 str函数或者print函数--->obj.__str__()
    33 repr或者交互式解释器--->obj.__repr__()
    34 如果__str__没有被定义,那么就会使用__repr__来代替输出
    35 注意:这俩方法的返回值必须是字符串,否则抛出异常
    36 '''
    37 print(format(s1,'nat'))
    38 print(format(s1,'tna'))
    39 print(format(s1,'tan'))
    40 print(format(s1,'asfdasdffd'))
    View Code
     1 date_dic={
     2     'ymd':'{0.year}:{0.month}:{0.day}',
     3     'dmy':'{0.day}/{0.month}/{0.year}',
     4     'mdy':'{0.month}-{0.day}-{0.year}',
     5 }
     6 class Date:
     7     def __init__(self,year,month,day):
     8         self.year=year
     9         self.month=month
    10         self.day=day
    11 
    12     def __format__(self, format_spec):
    13         if not format_spec or format_spec not in date_dic:
    14             format_spec='ymd'
    15         fmt=date_dic[format_spec]
    16         return fmt.format(self)
    17 
    18 d1=Date(2016,12,29)
    19 print(format(d1))
    20 print('{:mdy}'.format(d1))
    21 
    22 自定义format练习
    自定义format练习
     1 #_*_coding:utf-8_*_
     2 __author__ = 'Linhaifeng'
     3 
     4 class A:
     5     pass
     6 
     7 class B(A):
     8     pass
     9 
    10 print(issubclass(B,A)) #B是A的子类,返回True
    11 
    12 a1=A()
    13 print(isinstance(a1,A)) #a1是A的实例
    14 
    15 issubclass和isinstance
    issubclass和isinstance

    三、__doc__                                                                              

    class Foo:
        '我是描述信息'
        pass
    
    print(Foo.__doc__)
    它类的信息描述
    class Foo:
        '我是描述信息'
        pass
    
    class Bar(Foo):
        pass
    print(Bar.__doc__) #该属性无法继承给子类
    
    该属性无法被继承
    该属性无法被继承

    四、__module__和__class__                                                     

    __module__ 表示当前操作的对象在那个模块

    __class__     表示当前操作的对象的类是什么

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    
    class C:
    
        def __init__(self):
            self.name = ‘SB'
    
    lib/aa.py
    lib/aa.py
    from lib.aa import C
    
    obj = C()
    print obj.__module__  # 输出 lib.aa,即:输出模块
    print obj.__class__      # 输出 lib.aa.C,即:输出类
    index.py
  • 相关阅读:
    C# 反射
    WinForm资源管理器开发(TreeView&ListView)
    枚举——完美立方
    关于考证
    人工智能时代,程序员要不要精通算法?
    程序员需要掌握哪些软技能?
    Android数据解析——JSON
    C# 数组转json
    jQuery跨域调用Web API
    oracle 创建表同时添加注释
  • 原文地址:https://www.cnblogs.com/wangyongsong/p/6769226.html
Copyright © 2011-2022 走看看