除了__init__之外还有什么方法可以在构造类时接收值吗?

时间:2013-07-23 02:37:19

标签: python class parameters constructor initialization

以下是一个例子:

# 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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

@Ignacio获得了 init 部分。关于它是唯一的方法的问题:不,你可以使用任何其他函数将值输入到类的实例中。在您的示例中,您可以拥有

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

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

>>> m = MyString('abcdabcdabcd')
>>> m.str = "cbacbacba"

答案 2 :(得分: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']

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

答案 3 :(得分:0)

简短回答:建议的做法是使用__init__方法作为"构造函数"对于新实例。如果你不提供这个方法,那么你只能通过调用没有参数的类名来创建类的实例(正常方式)。

更长的答案:

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

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

类中的staticmethod可用于执行类似的操作并返回实例,例如,如果要实现单例模式。一个简单的例子:

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__方法的更为深奥的方法是use a metaclass以不同于正常情况的方式创建实例。但在实际应用中很少需要元类。