0

这是一个例子:

# class.py
class MyString:
    def __init__(self, str):
        self.str = str
    def __div__(self, sep):
        return self.str.split(sep)

>>> m = MyString('abcdabcdabcd')
>>> print m / 'b'
['a', 'cda', 'cda', 'cd']

__init__方法有两个参数:第一个self是实例对象本身str,第二个是调用传入的参数。是使用__init__唯一的方法将值获取到我的类的实例中吗?

或者,如果我不声明方法__init__,像这样的表达式会m = MyString('abcdabcdabcd')停止工作吗?

4

4 回答 4

0

简短回答:推荐的做法是将该__init__方法用作新实例的“构造函数”。如果不提供此方法,则只能通过不带参数调用类名来创建类的实例(正常方式)。

更长的答案:

使用最直接的替代方法__init__是在创建实例后设置属性:

class Foo(object): pass
x = Foo()
x.bar = 3

类中的Astaticmethod可以用来做这样的事情并返回实例,例如,如果你想实现单例模式。一个简单的例子:

class Foo(object):
  @staticmethod
  def newinstance():  # no self here
    x = Foo()
    x.bar = 3
    return x

y = Foo.newinstance()
print y.bar  # prints 3

在不实际提供方法的情况下初始化对象的一种更深奥的__init__方法是使用元类以不同于正常的方式创建实例。但元类在实际应用中很少需要。

于 2013-07-23T03:11:50.520 回答
0

初始值设定项( )始终用于捕获传递给构造函数( )的参数。没有它,构造函数将无法按预期工作。Class.__init__()Class()

于 2013-07-23T02:39:37.500 回答
0

@Ignacio 得到了初始化部分。至于关于它是唯一方法的问题:不,您可以使用任何其他函数将值放入类的实例中。在您的示例中,您可以

def set_string(self, new_string):
    self.str = new_string()

或者您可以直接为您的实例分配一个值:

>>> m = MyString('abcdabcdabcd')
>>> m.str = "cbacbacba"
于 2013-07-23T02:48:00.270 回答
0

默认情况下,创建对象时不带参数如下

a = Class()

然后__init__调用不带参数的方法。

如果您不使用__init__方法,则应创建不带参数的实例,如下所示

class MyString:
    def __div__(self, sep):
        return self.str.split(sep)
m = MyString()

但是如果你想给你的实例添加一个参数,你必须像在你的程序中那样使用带有参数的init 。

您可以按如下方式添加类变量

class MyString:
    str = ''
    def __init__(self,str):
        MyString.str = str
    def __div__(self, sep):
        return self.str.split(sep)
m = MyString('aSAA')
print(MyString.str)
#print(m.str)
['a', 'cda', 'cda', 'cd']

但是类变量是静态的,它是类本身的属性,而不是特定于对象。

于 2013-07-23T03:00:00.710 回答