相关疑难解决方法(0)

Python __init__和self他们做了什么?

我正在学习Python编程语言,而且我遇到了一些我不太了解的东西.

在如下方法中:

def method(self, blah):
    def __init__(?):
        ....
    ....
Run Code Online (Sandbox Code Playgroud)

怎么self办?这是什么意思?这是强制性的吗?

__init__方法有什么作用?为什么有必要?(等等.)

我认为它们可能是OOP结构,但我不太了解.

python oop self

737
推荐指数
18
解决办法
102万
查看次数

如何在Python中避免明确的"自我"?

我通过一些pygame教程学习Python .

在那里我发现了关键字self的广泛使用,并且来自主要的Java背景,我发现我一直忘记键入self.例如,而不是self.rect.centerx我要输入rect.centerx,因为对我来说,rect已经是类的成员变量.

对于这种情况,我可以想到的Java并行是必须使用前缀对成员变量的所有引用作为前缀.

我是否坚持使用self为所有成员变量添加前缀,或者有没有办法声明它们可以让我避免这样做?

即使我建议的不是pythonic,我仍然想知道它是否可能.

我已经看过这些相关的SO问题,但他们并没有完全回答我的想法:

python self

112
推荐指数
7
解决办法
4万
查看次数

在Python中进行自动属性赋值的最佳方法是什么,这是一个好主意吗?

而不是每次我定义一个类时都编写这样的代码:

class Foo(object): 
     def __init__(self, a, b, c, d, e, f, g):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e
        self.f = f
        self.g = g
Run Code Online (Sandbox Code Playgroud)

我可以使用此配方进行自动属性分配.

class Foo(object):
     @autoassign
     def __init__(self, a, b, c, d, e, f, g):
        pass
Run Code Online (Sandbox Code Playgroud)

两个问题:

  1. 这条捷径有缺点或陷阱吗?
  2. 有没有更好的方法来实现类似的便利?

python attributes decorator

31
推荐指数
4
解决办法
7186
查看次数

在Python中自动设置类成员变量

说,我在Python中有以下类

class Foo(object):
    a = None
    b = None
    c = None
    def __init__(self, a = None, b = None, c = None):
        self.a = a
        self.b = b
        self.c = c
Run Code Online (Sandbox Code Playgroud)

有没有办法简化这个过程?每当我向Foo类添加一个新成员时,我都被迫修改构造函数.

python constructor

29
推荐指数
3
解决办法
2万
查看次数

参数上的Python __init__ setattr?

通常__init__方法似乎与此类似:

def __init__(self, ivar1, ivar2, ivar3):
    self.ivar1 = ivar1
    self.ivar2 = ivar2
    self.ivar3 = ivar3
Run Code Online (Sandbox Code Playgroud)

有没有办法将参数转换为一个列表(不使用*args**kwargs),然后使用setattr设置实例变量,参数名称和参数传递?也许可以对列表进行切片,例如,您需要至少将其切片,[1:]因为您不需要self.self.

(实际上我想它需要是一个字典来保存名称和值)

像这样:

def __init__(self, ivar1, ivar2, ivar3, optional=False):
    for k, v in makedict(self.__class__.__init__.__args__): # made up __args__
        setattr(self, k, v)
Run Code Online (Sandbox Code Playgroud)

谢谢!

回应未知的答案,我发现这个工作:

Class A(object):
    def __init__(self, length, width, x):
        self.__dict__.update(dict([(k, v) for k, v in locals().iteritems() if k != 'self']))
Run Code Online (Sandbox Code Playgroud)

要么

Class A(object):
    def __init__(self, length, width, x):
        self.__dict__.update(locals())
        del self.__dict__['self']
Run Code Online (Sandbox Code Playgroud)

还不错..

python parameters initialization list setattr

5
推荐指数
2
解决办法
6634
查看次数

Pythonic方法用很多参数和默认值初始化一个对象

我需要创建一个带有很多参数的类.

class Line:

    def __init__(self, name, nb = None, price_unit = None, total = None, 
                 unit = None, time = None, session = None ):
Run Code Online (Sandbox Code Playgroud)

每个属性都将获得与传递给__init __()的参数相同的名称和相同的值.

所以,当然我可以这样做:

class MyClass:

    def __init__(self, name, nb = None, price_unit = None, total = None, 
                 unit = None, time = None, session = None ):
        self.name = name
        self.nb = nb
        self.price = price
        self.price_unit = price_unit
        self.total = total
        self.unit = unit
        self.time = time
        self.session = session
Run Code Online (Sandbox Code Playgroud)

但这是一个非常沉重的符号,对我来说似乎不是pythonic.你知道更多的pythonic方式吗?

python python-3.x

5
推荐指数
1
解决办法
1319
查看次数

自动保存构造函数参数

通常,类的构造函数将获取它的参数并将它们保存在实例上.例如:

class Example(object):
    def __init__(self, title='',backtitle='', height=20, width=50):
        self.title = title
        self.backtitle = backtitle
        self.height = height
        self.width = width
Run Code Online (Sandbox Code Playgroud)

这是重复的,所以我做了一个帮助函数来自动执行此操作:

from inspect import getargspec
def save_args(values):
    for i in getargspec(values['self'].__init__).args[1:]:
        values['self'].__dict__[i] = values[i]

class Example(object):
    def __init__(self, title='',backtitle='', height=20, width=50):
        save_args(vars())
Run Code Online (Sandbox Code Playgroud)

我的问题如下:

  • 这会因某些课程或课程而失败吗?
  • 它是可移植的,它是否适用于Jython等.它在python 2.7和3.2上适用于我
  • 有更简单的替代方案吗?
  • 那里有一个python包吗?

python constructor

3
推荐指数
1
解决办法
1136
查看次数

将所有初始化变量传递给 self

是否有一种标准方法将定义的所有参数传递__init__()给整个类(作为自参数)?

例如在我的程序中我通常这样做:

class DummyClass():
   def __init__(self,x,y,z):
      self.x = x
      self.y = y
      self.z = z
      ...
Run Code Online (Sandbox Code Playgroud)

有没有办法在不单独传递每个参数的情况下执行相同的操作?我想我曾经见过类似的事情super()

python oop

0
推荐指数
1
解决办法
79
查看次数