如何在不调用初始化程序的情况下创建类实例?

问题描述 投票:30回答:4

是否有避免在初始化类时调用它的方法,例如从类方法中调用__init__

[我试图在Python中创建一个不区分大小写和标点符号的字符串类,以进行有效的比较,但是在不调用__init__的情况下创建新实例时遇到了麻烦。

>>> class String:

    def __init__(self, string):
        self.__string = tuple(string.split())
        self.__simple = tuple(self.__simple())

    def __simple(self):
        letter = lambda s: ''.join(filter(lambda s: 'a' <= s <= 'z', s))
        return filter(bool, map(letter, map(str.lower, self.__string)))

    def __eq__(self, other):
        assert isinstance(other, String)
        return self.__simple == other.__simple

    def __getitem__(self, key):
        assert isinstance(key, slice)
        string = String()
        string.__string = self.__string[key]
        string.__simple = self.__simple[key]
        return string

    def __iter__(self):
        return iter(self.__string)

>>> String('Hello, world!')[1:]
Traceback (most recent call last):
  File "<pyshell#2>", line 1, in <module>
    String('Hello, world!')[1:]
  File "<pyshell#1>", line 17, in __getitem__
    string = String()
TypeError: __init__() takes exactly 2 positional arguments (1 given)
>>> 

我应该用什么替换string = String(); string.__string = self.__string[key]; string.__simple = self.__simple[key]来用切片初始化新对象?

编辑:

受下面编写的答案的启发,已对初始化程序进行了编辑,以快速检查是否没有参数。

def __init__(self, string=None):
    if string is None:
        self.__string = self.__simple = ()
    else:
        self.__string = tuple(string.split())
        self.__simple = tuple(self.__simple())

是否有避免在初始化类时调用__init__的方法,例如从类方法中调用它?我试图在Python中创建一个不区分大小写和标点符号的字符串类,用于...

python class constructor initialization
4个回答
42
投票
no

8
投票

2
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.