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

本文深入解析了Python中__new__, __init__和__str__魔法方法的使用和区别。通过实例详细介绍了这些方法如何在对象实例化过程中发挥作用,以及如何自定义这些方法以实现更复杂的对象行为。
Python3.8

Python3.8

Conda
Python

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

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开发、数据分析、人工智能和自动化脚本

Python 中,`__init__` 是一个特殊方法,用于初始化对象。与 `__init__` 类似的特殊方法还有很多,它们通常以双下划线开头结尾,也被称为魔法方法,在类的不同阶段发挥着重要作用。以下是一些常见的特殊方法: #### 1. `__new__` `__new__` 是在创建对象时调用的第一个方法,它负责创建并返回一个新的对象实例,然后才会调用 `__init__` 方法对这个实例进行初始化。 ```python class MyClass: def __new__(cls, *args, **kwargs): print("Creating instance") return super().__new__(cls) def __init__(self): print("Initializing instance") obj = MyClass() ``` #### 2. `__del__` `__del__` 是对象被销毁时调用的方法,也称为析构方法。当对象的引用计数为 0 时,Python 解释器会自动调用 `__del__` 方法。 ```python class MyClass: def __init__(self): print("Instance created") def __del__(self): print("Instance destroyed") obj = MyClass() del obj ``` #### 3. `__str__` `__str__` 方法用于返回对象的字符串表示形式,通常用于用户友好的输出。当使用 `print()` 函数或 `str()` 函数时,会调用这个方法。 ```python class MyClass: def __init__(self, value): self.value = value def __str__(self): return f"MyClass instance with value: {self.value}" obj = MyClass(42) print(obj) ``` #### 4. `__repr__` `__repr__` 方法也用于返回对象的字符串表示形式,但它更侧重于开发者调试记录日志。通常,`__repr__` 的返回值应该是一个可以用来重新创建该对象的有效 Python 表达式。 ```python class MyClass: def __init__(self, value): self.value = value def __repr__(self): return f"MyClass({self.value})" obj = MyClass(42) print(repr(obj)) ``` #### 5. `__len__` `__len__` 方法用于返回对象的长度或元素个数。当使用 `len()` 函数时,会调用这个方法。 ```python class MyList: def __init__(self, items): self.items = items def __len__(self): return len(self.items) my_list = MyList([1, 2, 3, 4, 5]) print(len(my_list)) ``` #### 6. `__getitem__` `__getitem__` 方法用于实现对象的索引访问。当使用 `obj[index]` 的形式访问对象时,会调用这个方法。 ```python class MyList: def __init__(self, items): self.items = items def __getitem__(self, index): return self.items[index] my_list = MyList([1, 2, 3, 4, 5]) print(my_list[2]) ``` #### 7. `__setitem__` `__setitem__` 方法用于实现对象的索引赋值。当使用 `obj[index] = value` 的形式给对象赋值时,会调用这个方法。 ```python class MyList: def __init__(self, items): self.items = items def __setitem__(self, index, value): self.items[index] = value my_list = MyList([1, 2, 3, 4, 5]) my_list[2] = 10 print(my_list.items) ``` #### 8. `__call__` `__call__` 方法使得对象可以像函数一样被调用。当使用 `obj()` 的形式调用对象时,会调用这个方法。 ```python class MyFunction: def __init__(self, multiplier): self.multiplier = multiplier def __call__(self, value): return value * self.multiplier multiply_by_two = MyFunction(2) result = multiply_by_two(5) print(result) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值