zoukankan      html  css  js  c++  java
  • 特殊属性和方法

    一、特殊属性

    __dict__:获得类对象或实例对象所绑定的所有属性和方法的字典

    class A:
        pass
    class B:
        pass
    class C(A,B):
        def __init__(self,name,age):
            self.name=name
            self.age=age
    
    x=C('秦健峰',23)
    print(x.__dict__)#x是C的一个实例对象,可以发现其属性以字典的形式显示出来
    print(C.__dict__)#显示类对象的属性和方法
    
    print(x.__class__)#可以显示某个实例对象属于哪一个类中
    print(C.__bases__)#可以显示C类的父类类型的元素
    
    print(A.__subclasses__())#查看A的子类
    
    运行结果:
    
    {'name': '秦健峰', 'age': 23}
    {'__module__': '__main__', '__init__': <function C.__init__ at 0x0000026449B6DCA0>, '__doc__': None}
    <class '__main__.C'>
    (<class '__main__.A'>, <class '__main__.B'>)
    [<class '__main__.C'>]

    二、特殊方法

    __len__():通过重写__len__()方法,让内置函数len()的参数可以是自定义类型

    __add__():通过重写__add__()方法,可使用自定义对象具有+功能

    a=20
    b=100
    
    c=a+b   #两个整数相加
    print(c)
    d=a.__add__(b)
    print(d)#可以发现,a+b其实是调用了__add__()方法
    
    '''现在我们来试可不可以自定义对象相加
    '''
    class Student:
        def __init__(self,name):
            self.name=name;
    
        #重写add函数
        def __add__(self, other):
            return self.name+'在'+other.name
        #重写__len__函数
        def __len__(self):
            return (len(self.name))
    stu1=Student('小秦同学')
    stu2=Student('华中农业大学')
    
    #如果没重写“+“方法,会出现错误:TypeError: unsupported operand type(s) for +: 'Student' and 'Student'
    s=stu1+stu2
    print(s)
    s=stu1.__add__(stu2)
    print(s)
    
    print('-----------------------------------------------------------')
    
    lst=[11,22,33,44,55]
    print(len(lst))
    #可以看到,在使用len()函数时,其实就是在调用__len__()
    print(lst.__len__())
    #如果没有重写__len__函数,可以发现报错:TypeError
    print(len(stu1))
    print(len(stu2))
    
    运算结果:
    
    120
    120
    小秦同学在华中农业大学
    小秦同学在华中农业大学
    -----------------------------------------------------------
    5
    5
    4
    6
    
    Process finished with exit code 0

    __new__():用于创建对象

    __init__():对创建的对象进行初始化

    class Person:
        def __new__(cls, *args, **kwargs):
            print('__new__被调用执行,cls的id值为{0}'.format(id(cls)))
    
            obj=super().__new__(cls)
            print('创建的对象的id为:{0}'.format(id(obj)))
    
            return obj
    
        def __init__(self,name,age):
            print('__init__被调用,self的id值为:'.format(id(self)))
            self.name=name
            self.age=age
    
    print('Object这个类对象的id为:{0}'.format(id(object)))
    print('Person这个类对象的id为:{0}'.format(id(Person)))
    
    #创建Person类的实例对象
    person=Person('张三',56)
    print('person这个实例对象的id为:{0}'.format(id(person)))
    
    运行结果:
    
    Object这个类对象的id为:140703772753408
    Person这个类对象的id为:1192429430288
    __new__被调用执行,cls的id值为1192429430288
    创建的对象的id为:1192436461328
    __init__被调用,self的id值为:1192436461328
    person这个实例对象的id为:1192436461328
    
    '''
    可以发现,在创建实例对象时,先调用的是new()方法,且传入new()方法的参数是Person类对象(两者id值一样)
    在new()方法中通过调用父类new()方法,可以发现其所创建的实例对象就是Person创建的实例对象(两者id值一样)
    '''
    

    1、在创建实例对象时,可以发现会先将Person传入到new()方法中的cls

    2、new()方法返回的obj对象然后返回给init()函数中的self

    3、单init()方法执行结束后,再将self返回给person

  • 相关阅读:
    poj 3068 Bridge Across Islands
    XidianOJ 1086 Flappy v8
    XidianOJ 1036 分配宝藏
    XidianOJ 1090 爬树的V8
    XidianOJ 1088 AK后的V8
    XidianOJ 1062 Black King Bar
    XidianOJ 1091 看Dota视频的V8
    XidianOJ 1098 突击数论前的xry111
    XidianOJ 1019 自然数的秘密
    XidianOJ 1109 Too Naive
  • 原文地址:https://www.cnblogs.com/xiaoqing-ing/p/14992642.html
Copyright © 2011-2022 走看看