面对对象编程03

'''
魔术方法
1.__init__
初始化魔术方法
触发时机:初始化对象时触发(不是实例化触发,但是和实例化在一个操作中)
参数:至少有一个self,接收对象
返回值:无
作用:初始化对象的成员
注意:使用该方式初始化的成员都是直接写入对象当中,类中无法具有

class dog():
def __init__(self):
self.name = 'dog'
self.name = dog
self.name = input('输入你的狗狗的名字')

2.__new__
__new__是在实例创建之前被调用的,因为它的任务就是创建实例然后返回该实例对象,是个静态方法!!!!!!
将类比作制造商,__new__方法就是前期的原材料购买环节,__init__方法就是在有原材料的基础上,加工,初始化商品环节!!!!!
实例化魔术方法
触发时机: 在实例化对时触发
参数:至少一个cls 接收当前类
返回值:必须返回一个对象实例
作用:实例化对象
注意:实例化对象是Object类底层实现,其他类继承了Object的__new__才能够实现实例化对象。
没事别碰这个魔术方法,先触发__new__才会触发__init__

实例化!初始化这个要知道
class dog():
def __new__(cls, *args, **kwargs):
print('------->new')
会覆盖底层的魔术方法,只要加了这个就会覆盖底层的__new__,而底层的__new__是属于project的,它能干的事情其实更加多

class dog():
def __new__(cls, *args, **kwargs):
print('------->new')

1.return super(Dog, cls).__new__(cls, *arg, *kwargs) 这样的话就能两个同时产生,这样的话才能访问到__init__
2.return object.__new__(cls,*args,**kwargs)

(1)__new__ new开辟新的空间
(2)------->new
(3)return object.__new__(cls,*args,**kwargs) 申请内存开辟空间 返回的是一个地址:0x123456574845
--------------------------------------------------------------------------------------------------------
class A(object):
pass

a=A() # 默认调用父类object的__new__()方法来构造该类的实例
print (a) # 返回的是<__main__.A object at 0x0000024352732630>
区别:
class A(object):

def __new__(cls):
"重写__new__方法"
return "abc"

a=A()
print (a) # 'abc',实例化对象取决于__new__方法,__new__返回什么就是什么




3.def __call__(self,*args,**kwargs):
print('-------------->call')

class Dog():
def __call__(self,name):
print('----------',name)

a = Dog()
a()
调用对象的魔术方法
触发时机:将对象当作函数调用时触发 对象()
参数:至少一个self接收对象,其余根据调用时参数决定
返回值:根据情况而定
作用:可以将复杂的步骤进行合并操作,减少调用的步骤,方便使用
注意:无
把对象当成函数用的时候,写一个__call__就行



4.__del__ delect的缩写
析构魔术方法
触发时机:当对象没有用(没有任何变量引用)的时候被触发
参数:一个self 结婚搜对象
返回值:无
作用:使用完对象是回收资源
注意:del不一定会触发当前方法,只有当前对象没有任何变量接收时才会触发

import sys
class Preson:
def __init__(self, name):
self.name = name
def __del__(self):
print('zzz')
P = Preson('jack')
p1 = P
print(p1.name)
print(sys.getrefcount(P)) # 查看P这个空间被几个引用了
del p1 # 只是断掉了p1这个的引用 ,而且它是在最后面的

1.对象赋值 p = preson() 可以把p赋值给别的,p会和别的指向同一个地址
2.删除地址的引用 del 变量名 删除变量对地址的引用
3.查看对地址引用的次数 print(sys.getrefcount(P))
4.del 当一个空间没有任何引用的时候,会用del删除这个空间的所有的引用,rel = 0,就会默认执行__del__
5.在p = p1 p = p2 del p1 del p2的时候会因为python底层解释器的原因,最后执行__del__
'''

'''
__str__
触发时机:使用print(对象)或者str(对象)的时候触发
参数:一个self接收对象
返回值:必须是字符串类型
作用:print(对象时)进行操作,得到字符串,通常用于快捷操作
注意:无
class Preson:
def __init__(self, name,age):
self.name = name
self.age = age

def __str__(self):
return '姓名是{},年龄是{}'.format(self.name,str(self.age))


p = Preson('tom',99)
print(p) # tom
# 单传打印一个地址,对于开发者来说意义不大
# 打印名字出来更多的信息量,那么就要重写__str__
注意的是 return的就是你要打印回来的东西。
'''

class Preson:

def __init__(self, name,age):
self.name = name
self.age = age

def __str__(self):
return '姓名是{},年龄是{}'.format(self.name,str(self.age))


p = Preson('tom',99)
print(p) # tom
# 单传打印一个地址,对于开发者来说意义不大
# 打印名字出来更多的信息量,那么就要重写__str__
posted @ 2020-02-14 12:59  smartcat994  阅读(83)  评论(0编辑  收藏  举报