Python学习 Day08 特殊属性和特殊方法

特殊属性和特殊方法

(一)特殊属性

  • __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)) #结果为4len()是内置函数,用于计算列表长度
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

你可能感兴趣的:(python,类)