Python中的 new, init 和 __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
本文深入解析了Python中__new__, __init__和__str__魔法方法的使用和区别。通过实例详细介绍了这些方法如何在对象实例化过程中发挥作用,以及如何自定义这些方法以实现更复杂的对象行为。
3万+

被折叠的 条评论
为什么被折叠?



