• 面对对象编程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__
  • 相关阅读:
    我的WCF之旅(1):创建一个简单的WCF程序
    网页设计中颜色的搭配
    CSS HACK:全面兼容IE6/IE7/IE8/FF的CSS HACK
    UVa 1326 Jurassic Remains
    UVa 10340 All in All
    UVa 673 Parentheses Balance
    UVa 442 Matrix Chain Multiplication
    UVa 10970 Big Chocolate
    UVa 679 Dropping Balls
    UVa 133 The Dole Queue
  • 原文地址:https://www.cnblogs.com/SmartCat994/p/12306935.html
Copyright © 2020-2023  润新知