我有一个带有__init__
函数的类。
当对象被创建时,如何从这个函数中返回一个整数值?
我编写了一个程序,在其中__init__
函数执行命令行解析,并且我需要设置一些值。将其设置为全局变量并在其他成员函数中使用是否可以?如果可以,如何操作呢?到目前为止,我在类之外声明了一个变量。但是在一个函数中设置它并不会反映在其他函数中??
如果你想在调用一个类时返回一些其他的对象,那么可以使用__new__()
方法:
class MyClass:
def __init__(self):
print("never called in this case")
def __new__(cls):
return 42
obj = MyClass()
print(obj)
# Output: 42
__init__
中添加一些新的可选参数时,您意识到为了提供所需的灵活性,您需要一个返回专门子类实例的类工厂。但是,您库的用户已经在使用您现有的API。为了保留它,您重写了__new__
以返回专门子类的实例。 - Mark Amery__new__
来实现这一点。 - Zearin__init__
必须返回 None。你不能(或者至少不应该)返回其他值。
尝试将你想要返回的内容作为实例变量(或函数)。
>>> class Foo:
... def __init__(self):
... return 42
...
>>> foo = Foo()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: __init__() should return None
new
关键字?Python 中是否隐含了 new
关键字?我认为 Python 的语义与使用此关键字的 Java 和其他语言不同。 - cs95super().__init__
传递数据到派生类,那将是很好的。 - c z根据__init__文档:
在构造函数中有一个特殊的限制,就是不能返回任何值;如果返回值则会导致在运行时引发TypeError异常。
下面的代码可作为证明:
class Foo(object):
def __init__(self):
return 2
f = Foo()
给出以下错误:Traceback (most recent call last):
File "test_init.py", line 5, in <module>
f = Foo()
TypeError: __init__() should return None, not 'int'
问题的样例使用可以如下:
class SampleObject(object):
def __new__(cls, item):
if cls.IsValid(item):
return super(SampleObject, cls).__new__(cls)
else:
return None
def __init__(self, item):
self.InitData(item) #large amount of data and very complex calculations
...
ValidObjects = []
for i in data:
item = SampleObject(i)
if item: # in case the i data is valid for the sample object
ValidObjects.append(item)
__new__(cls, Item)
中的self
未定义。 - Hart Simha如果没有返回语句,像其他方法和函数一样,__init__
方法默认返回 None。因此,你可以写出下面两种形式中的任何一种:
class Foo:
def __init__(self):
self.value=42
class Bar:
def __init__(self):
self.value=42
return None
当然,添加return None
并没有任何作用。
我不确定你想要什么,但你可能会对其中一个感兴趣:
class Foo:
def __init__(self):
self.value=42
def __str__(self):
return str(self.value)
f=Foo()
print f.value
print f
输出:
42
42
f = Foo().value
- JLT__init__
返回任何内容。 - quamrana__init__
不返回任何值,并且应始终返回 None
。
class Foo:
def __init__(self):
#Do your stuff here
self.returncode = 42
bar = Foo()
baz = bar.returncode
我们无法从init中返回值。但我们可以使用new来返回值。
class Car:
def __new__(cls, speed, unit):
return (f"{speed} with unit {unit}")
car = Car(42, "km")
print(car)
__new__
返回任意值并仍然使类“protocol”有意义。 - chepnerclass Solve:
def __init__(self,w,d):
self.value=w
self.unit=d
def __str__(self):
return str("my speed is "+str(self.value)+" "+str(self.unit))
ob=Solve(21,'kmh')
print (ob)
输出: 我的速度是21公里/小时
只是想补充一下,你可以在__init__
中返回类。
@property
def failureException(self):
class MyCustomException(AssertionError):
def __init__(self_, *args, **kwargs):
*** Your code here ***
return super().__init__(*args, **kwargs)
MyCustomException.__name__ = AssertionError.__name__
return MyCustomException
上述方法可以帮助您在测试中对异常执行特定操作
super().__init__
返回的是 None
,所以你返回 None
是可以的,但是多余了。 - c z
__init__
;如果您描述您真正想要实现的内容,我们可以帮助您。 - S.Lott__init__
应该不要进行命令行解析。定义一个类方法来执行实际的解析,并将解析后的值传递给__init__
。让__init__
关注创建必要的属性,而不是弄清楚如何生成这些属性的值。 - chepner__init__
方法获取通用信息,请参考此处给出的答案。如果您想表示发生了错误,请引发异常。这并没有回答在此处提出的问题,但可能是您所需要的。 - Karl Knechtel