基础理解Python中的 __new__, __init__ 和 __str__魔法方法

本文深入解析了Python中__new__, __init__和__str__魔法方法的使用和区别。通过实例详细介绍了这些方法如何在对象实例化过程中发挥作用,以及如何自定义这些方法以实现更复杂的对象行为。
部署运行你感兴趣的模型镜像

Python中的 newinit 和 __str__魔法方法

#coding=utf-8
__author__ = 'Bright'
class Foo(object):
    def __init__(self ,*args,**kwargs):
        """在创建完对象之后 会自动调用, 它完成对象的初始化的功能"""
        self.args = args
        self.kwargs =kwargs

    def __new__(cls,x,*args,**kwargs):
        '''
         一,new()方法简单来说就是类的静态方法,是在类准备将自身实例化时调用。在Python 中存在于类里面的构造方法init()负责将类的实例化,是新式类中真正的实例化方法。
         而在init()调用之前,new()决定是否要使用该init()方法,因为new()可以调用其他类的构造方法或者直接返回别的对象来作为本类的实例。
         二,如果类中没有重写new()方法,那么就会用父类的new()方法来构造该类的实例,如果该类的父类也没有重写 new(),那么将一直按此规矩追溯至object的new()方法,因为object是所有新式类的基类。
        :param cls:   #第一个参数cls是当前正在实例化的类。
        :param args:  除去json(字典)类型外的所有参数集合,是个元组,此处包括参数 x
        :param kwargs:  json(dict)
        :return: 决定是否要使用该init()方法,还是调用其他类的构造方法或者直接返回别的对象来作为本类的实例。
        '''
        self = object.__new__(cls)
        self.x = x
        return self
    def eat(self):
        print self.x

foo =Foo(10,'args','nice',name ='wu',age = 10)
print foo
print foo.x , foo.args,foo.kwargs
foo.eat()

class Bar(Foo):
    def __init__(self ,*args,**kwargs):
        self.args = args
        self.kwargs =kwargs
    def __str__(self):
        """
        返回一个对象的描述信息
       当未定义此方法时,返回<__main__.Foo object at xxxxxxxxxx>
       # 类似__repr__方法,但str()可读性较高

       """
        return 'x:%s,str:%s,dict:%s'%(self.x,self.args,self.kwargs)
bar = Bar(20,'xiao','largh',name = 'laowang',age=40)
print bar
print bar.__dict__  
# <__main__.Foo object at 0x02420D50>
# 10 (10, 'args', 'nice') {'age': 10, 'name': 'wu'}
# 10
# x:20,str:(20, 'xiao', 'largh'),dict:{'age': 40, 'name': 'laowang'}
# {'x': 20, 'args': (20, 'xiao', 'largh'), 'kwargs': {'age': 40, 'name': 'laowang'}}

class B(object):
def init(self ,*args,**kwargs):
print ‘B INIt’
def fn(self):
print ‘B fn’
class A(object):
def init(self ,*args,**kwargs):
print ‘A INIT’
def fn(self):
print ‘A fn’

def __new__(cls,a):
    if a>10:
    #决定使用此类的init()方法
     return super(A,cls).__new__(cls)
    #返回 B对象来作为本类的实例。
    return  B()

a1 = A(5)
a1.fn()
a2 = A(20)
a2.fn()

# B INIt
# B fn
# A INIT
# A fn

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值