- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
根据python documentation , __init__
可以接受可变参数:
object.__init__(self[, ...])
Called after the instance has been created (by
__new__()
), but before it is returned to the caller. The arguments are those passed to the class constructor expression. If a base class has an__init__()
method, the derived class’s__init__()
method, if any, must explicitly call it to ensure proper initialization of the base class part of the instance; for example:
BaseClass.__init__(self, [args...]).
我正在努力理解如何在直接派生自 object
的类上使用可变参数.特别是,当试图实例化一个调用 super(<classname>, self).__init__(*args, **kwargs)
的类时,我发现如果我不带参数实例化类,一切都很好。
但是,如果我将参数传递给 init 函数,则会出现错误:
super(A,self).__init__(*args,**kwargs)
TypeError: object.__init__() takes no parameters
据我了解object.__init__
应该能够根据文档获取参数——它还使编写代码更容易,因为每个类都可以将其参数向上传递到类层次结构中。
文档是否不正确,或者是 object.__init__
特例?
代码如下:
class A(object):
def __init__(self, *args, **kwargs):
for i,a in enumerate(args):
print "arg", i,a
for k,v in kwargs.iteritems():
print "kwarg", k,v
super(A,self).__init__(*args,**kwargs)
a=A()
print "Done with first one"
a2=A(5,4,5,3)
最佳答案
您对文档的解释有问题。在你的第一行 object.__init__(self[, ...])
不是指可变参数。它只是说 可能 __init__
的参数不是 self
。
__init__
在被 super
或任何其他方式调用方面与任何其他方法没有区别。举一个不那么令人困惑的例子,比如 abs
.如果您将多个参数传递给 abs
,它将引发 TypeError: abs() takes exactly one argument (2 given)
。这是正常的,也是意料之中的。如果您将比预期更多的参数传递给 __init__
方法,您将得到相同的错误。
未声明能够接受可变参数的 Python 方法将无法接受任意参数。 object.__init__
不接受任何参数。您可以从 __init__
将其全部作为 object.__init__(self)
或 super(type(self), self).__init__()
.
您可以重写您的示例,使其看起来像这样:
class A(object):
def __init__(self, *args, **kwargs):
for i, a in enumerate(args):
print "arg", i, a
for k, v in kwargs.iteritems():
print "kwarg", k, v
super(A, self).__init__()
起初这看起来毫无意义,因为您正在扩展一个不需要初始化的类 (object
)。然而,即使是这个简单的示例也表明您可以为您的类处理一些参数,并将其他参数传递给基类。
一个常见的习惯用法是显式命名所有子类的参数(位置参数和关键字参数),让父构造函数处理其余部分。例如,请考虑以下内容:
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
class Citizen(Person):
def __init__(self, nationality, *args, **kwargs):
self.nationality = nationality
super(Citizen, self).__init__(*args, **kwargs)
在这种情况下,声明 Citizen
以除了接受普通参数之外的可变参数是非常方便的。您不必记住 Person
接受的参数,或者在参数发生变化时修改任何内容。但是,这并不意味着您可以使用完全任意的参数调用 Citizen.__init__
。一共还是要传入三个参数,关键字只能有名字。 国籍
、姓名
和年龄
。请注意,Person.__init__
甚至懒得调用 object.__init__
。
要牢记的重要一点是,您将要处理的所有真实类,无论是来自 Python 库还是外部源,都应该有足够的文档记录,以告诉您什么可以传入,什么不能传入。只是因为某些东西在技术上接受可变参数,并不意味着它对可以传入的内容没有限制。
关于Python __init__ 和可变参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45293721/
为什么禁用类型像 type t = A of int | B of string * mutable int 虽然允许此类类型: type t = A of int | B of string * i
我正在寻找一种类似结构的数据结构,我可以从中创建多个实例并具有某种类型提示而不是不可变的。 所以我有这样的东西: class ConnectionConfig(NamedTuple): nam
我需要转到引用的结构: class SearchKnot { var isWord : Bool = false var text : String = "" var to
如sec 10.4.3中所述 当控制进入执行时,执行以下步骤 功能对象F(调用者)中包含的功能代码的上下文 提供thisArg,而调用方提供argumentsList: 如
i make a game that start display Activity indicator And activity indicator bottom display UiLable wi
编辑:我在这里不断获得支持。只是为了记录,我认为这不再重要。自从我发布它以来我就不再需要它了。 我想在 Scala 中执行以下操作... def save(srcPath: String, destP
使用可变对象作为 Hashmap 键是一种不好的做法吗?当您尝试使用已修改足以更改其哈希码的键从 HashMap 中检索值时,会发生什么? 例如,给定 class Key { int a; /
如果您在Kotlin中访问List类型的Java值,则将获得(Mutable)List!类型。 例如。: Java代码: public class Example { public stati
我编写了 str 类(内置)的以下扩展,以便执行以下操作:假设我有字符串 "Ciao" ,通过做"Ciao" - "a"我想要的结果是字符串 "Cio" 。这是执行此操作的代码,并且运行良好: cla
使用可变对象作为 Hashmap 键是一种不好的做法吗?当您尝试使用已修改足以更改其哈希码的键从 HashMap 中检索值时,会发生什么? 例如,给定 class Key { int a; /
我正在为我的公司设计一个数据库来管理商业贷款。每笔贷款都可以有担保人,可以是个人或公司,在借款业务失败时作为财务支持。 我有 3 个表:Loan、Person 和 Company,它们存储明显的信息。
我使用二进制序列化从 C# 类中保存 F# 记录。一切正常: F#: type GameState = { LevelStatus : LevelStatus
import javax.swing.JOptionPane; public class HW { public static void main(String[] args) { Strin
使用 flatbuffer mutable 有多少性能损失? 是否“正确”使用 FlatBuffers 来拥有一个应该可编辑的对象/结构(即游戏状态) 在我的示例中,我现在有以下类: class Ga
std::function create_function (args...) { int x = initial_value (args...); return [x] () mut
我需要在 for 循环中找到用户输入的字符。我通常会这样做 如果(句子[i] == 'e') 但是因为在这里,'e' 将是一个单字母字符变量,我不知道如何获取要比较的值。我不能只输入 if (sent
我有一个这样的算法: let seed: Foo = ... let mut stack: Vec = Vec::new(); stack.push(&seed); while let Some(ne
这个问题可能看起来非常基础,但我很难弄清楚如何做。我有一个整数,我需要使用 for 循环来循环整数次。 首先,我尝试了—— fn main() { let number = 10; // An
如果我有以下结构: struct MyStruct { tuple: (i32, i32) }; 以及以下函数: // This will not compile fn function(&mut s
我希望在每个 session 的基础上指定列的默认值。下面的脚本不起作用,但描述了我想如何使用它。我目前使用的是 MySQL 5.5.28,但如果需要可以升级。 CREATE TABLE my_tbl
我是一名优秀的程序员,十分优秀!