• 特殊属性和方法


    一、特殊属性

    __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

  • 相关阅读:
    java_JDBC(3)
    java_JDBC(2)
    java_JDBC(1)
    seq语句随笔
    bzoj3159: 决战
    bzoj3905: Square
    bzoj3864: Hero meet devil
    有上下界的网络流问题
    uva12538
    bzoj3280: 小R的烦恼
  • 原文地址:https://www.cnblogs.com/xiaoqing-ing/p/14992642.html
Copyright © 2020-2023  润新知