以下是一个例子:
# 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')
这样的表达式会不会起作用?
答案 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以不同于正常情况的方式创建实例。但在实际应用中很少需要元类。