特殊方法和特殊属性十六

本文详细介绍了Python面向对象编程中的特殊属性和方法,包括__dict__、__bases__、__base__、__mro__以及__add__、__len__和__new__等。通过示例解释了它们的功能和使用场景,展示了如何实现对象的加法运算、长度计算以及对象创建的过程。同时,文章强调了__new__和__init__在对象创建过程中的先后顺序和作用。
摘要由CSDN通过智能技术生成

 1)特殊属性

#1)特殊属性
print(dir(object)) #查看对象具备哪些属性和方法dir()

class A:
    pass
class B:
    pass
class C(A,B):
    def __init__(self,name,age):
        self.name=name
        self.age=age
class D(A):
    pass
#创建c类对象
a=C('jack',20) #a是C类型的一个是咧属性
print(a.__dict__) #实例对象的属性 字典 {'name': 'jack', 'age': 20}
print(C.__dict__) #{'__module__': '__main__', '__init__': <function C.__init__ at 0x00000161D08CD4C0>, '__doc__': None}
#实例对象输出的是属性字典。类对象输出的是属性以及方法字典。
#方法是在类对象当中的,实例对象只能负责调用
print(a.__class__)  #输出对象所属的类 <class '__main__.C'>
print(C.__bases__)  #输出的父类类型的元组(<class '__main__.A'>, <class '__main__.B'>)
print(C.__base__) #类的基类,谁挨在前面就输出谁 <class '__main__.A'>
print(C.__mro__)  #类的层次结构
print(A.__subclasses__())  #子类的列表 [<class '__main__.C'>, <class '__main__.D'>]

2)特殊方法 

__add__()

#2)特殊方法
#例1 __add__()
a=20
b=100
c=a+b #两个整数类型的对象的相加操作
d=a.__add__(b)
print(c)
print(d)

#例2
class Student:
    def __init__(self,name):
        self.name=name
    def __add__(self, other):
        return self.name+other.name

stu1=Student('张三')
stu2=Student('李四')

s=stu1+stu2  #实现了两个对象的加法运算(因为在student中编写了__add__()特殊方法)
print(s) #张三李四
#以下书写方式输出结果同上
s=stu1.__add__(stu2)
print(s) #张三李四

__len_() 

class Student:
    def __init__(self,name):
        self.name=name
    def __len__(self):
        return len(self.name)

stu1=Student('jack')
print(len(stu1)) #4

#__len__
lst=[11,22,33]
print(len(lst)) #3 len()是内置函数
print(lst.__len__()) #3 特殊方法

__new__

#__new__() 创建对象
class Person(object):

    def __new__(cls, *args, **kwargs):
        print('__new__被调用执行了,cls的id值为{0}'.format(id(cls))) #__new__被调用执行了,cls的id值为2005719952352
        obj=super().__new__(cls) #调用父类person中__new__()方法,赋值给obj
        print('创建的对象id为{0}'.format(id(obj))) #创建的对象id为2005721087760
        return obj

    def __init__(self,name,age):
        print('__init__被调用了,self的id值为{0}'.format(id(self))) #__init__被调用了,self的id值为2005721087760
        self.name=name
        self.age=age

print('object这个类对象的id值为:{0}'.format(id(object))) #object这个类对象的id值为:140706624753152
print('Person这个类对象的id值为:{0}'.format(id(Person))) #Person这个类对象的id值为:2005719952352

#创建Person类的实例对象
p1=Person('张三',20) #先执行=右边的代码
print('p1这个Person类的实例对象的id:{0}'.format(id(p1))) #p1这个Person类的实例对象的id:2005721087760

__new__()在前,去创建对象.__init__()在后,为这个对象的实例对象进行赋值,最后将创建的对象放到p1当中进行存储.

执行顺序关系图:

1)先将Person传给__new__()方法中的cls 
2)将cls传给objec的__new__里创建了对象obj 
3)将创建的对象obj赋值返回给self 
4)对象创建完成并且初始化完毕,将self赋值给到p1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值