特殊属性和特殊方法
(一)特殊属性
- __dict__方法:获得类对象或实例对象所绑定的所有属性和方法的字典
class A:
pass
class B:
pass
class C(A,B):
def __init__(self,name,age):
self.name=name
self.age=age
#创建C类的对象
c=C('Jack',23)
print(c.__dict__) #实例对象的属性
print(C.__dict__) #类对象的方法
print('-------------------------------------------')
print(c.__class__) #输出对象所属的类
print(C.__bases__) #C类的父类类型的元素
print(C.__base__)
print(C.__mro__) #类的层次结构
print(A.__subclasses__())
(二)特殊方法
- 1.len()方法:通过重写__len__()方法,让内置函数len()的参数可以是自定义类型
- 2.add()方法:通过重写__add__()方法,可以使自定义对象具有“+”功能
- 3.new()方法:用于创建对象
- 4.init()方法:对创建对象的初始化
a=20
b=45
c=a+b #两个整数类型的对象的相加
d=a.__add__(b) #65
print(c) #65
print(d) #65
class Student:
def __init__(self,name): #实例属性
self.name=name
def __add__(self, other): #在类中重写了__add__()方法,使该类的两个对象能够相加
return self.name+other.name
#创建实例对象
stu1=Student('张三')
stu2=Student('李四')
s=stu1+stu2
#print(stu1+stu2) #报错,实例对象不能相加
print(s) #张三李四
s=stu1.__add__(stu2) #等价于stu1+stu2
print(s) #张三李四
class Student:
def __init__(self,name): #实例属性
self.name=name
def __add__(self, other): #在类中重写了__add__()方法,使该类的两个实例对象能够相加
return self.name+other.name
def __len__(self,name):
return len(self.name) #在类中重写了__len__()方法,用于计算该类的实例长度
lst=[12,34,56,24]
print(len(lst)) #结果为4,len()是内置函数,用于计算列表长度
print(lst.__len__()) #4
print(len(stu1.name)) #没在类中重写__len__()方法时报错:object of type 'Student' has no len()
#重写后‘张三’的长度为 2
class Person:
def __init__(self, name, age):
print('__init__方法被调用了,self的id值为{0}'.format(id(self)))
self.name = name
self.age = age
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
print('object这个类对象的id为:{0}'.format(id(object)))
print('Person这个类对象的id为{0}'.format(id(Person)))
#创建Person类的实例对象
p1=Person('张三',24)
print('p1这个Person类的实例对象的id为:{0}'.format(id(p1)))
object这个类对象的id为:1700574656
Person这个类对象的id为2653101470232
__new__被调用执行了,cls的id值为2653101470232
创建的对象id为2653133666736
__init__方法被调用了,self的id值为2653133666736
p1这个Person类的实例对象的id为:2653133666736
二、类的赋值与拷贝
- 1.变量的赋值操作: 只是形成两个变量,实际上还是执行同一对象
- 2.浅拷贝: Python拷贝一般都是浅拷贝,拷贝时,对象包含的子对象内容不拷贝。因此源对象与拷贝对象都会引用同一个对象
- 3.深拷贝:使用copy模块的deepcopy()函数,递归拷贝对象中包含的子对象,源对象和拷贝对象所有的子对象也不相同
class CPU:
pass
class Disk:
pass
class Computer:
def __init__(self,cpu,disk):
self.cpu=cpu
self.disk=disk
#(1)变量的赋值
cpu1=CPU()
cpu2=cpu1
print(cpu1)
print(cpu2)
#(2)类的浅拷贝
print('-------------------------')
disk=Disk() #创建一个键盘类的对象
computer=Computer(cpu1,disk) #创建一个计算机类的对象
#浅拷贝
import copy
computer2=copy.copy(computer)
print(computer,computer.cpu,computer.disk)
print(computer2,computer2.cpu,computer2.disk)
print('------------------------------')
#深拷贝
computer3=copy.deepcopy(computer2)
print(computer2,computer2.cpu,computer2.disk)
print(computer3,computer3.cpu,computer3.disk)
<__main__.CPU object at 0x000001979060FF98>
<__main__.CPU object at 0x000001979060FF98>
-------------------------
<__main__.Computer object at 0x0000019790618080> <__main__.CPU object at 0x000001979060FF98> <__main__.Disk object at 0x00000197906180F0>
<__main__.Computer object at 0x0000019790618128> <__main__.CPU object at 0x000001979060FF98> <__main__.Disk object at 0x00000197906180F0>
------------------------------
<__main__.Computer object at 0x0000019790618128> <__main__.CPU object at 0x000001979060FF98> <__main__.Disk object at 0x00000197906180F0>
<__main__.Computer object at 0x0000019790618160> <__main__.CPU object at 0x0000019790618710> <__main__.Disk object at 0x0000019790626F60>
Process finished with exit code 0