zoukankan      html  css  js  c++  java
  • 面对对象编程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__
  • 相关阅读:
    个人博客08
    《新浪微博平台架构》---阅读
    《阿里游戏高可用架构设计实践》---阅读
    《京东咚咚架构演进》---阅读
    《京东话费充值系统架构演进实践》--阅读
    实时获取input框内容
    html:判断两次密码不一致以及阻止提交
    《京东到家库存系统架构设计》---阅读
    《数据蜂巢架构演进之路》---阅读
    SOA案例分析浅谈
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/12306935.html
Copyright © 2011-2022 走看看