我正在学习Python编程语言,而且我遇到了一些我不太了解的东西.
在如下方法中:
def method(self, blah):
def __init__(?):
....
....
Run Code Online (Sandbox Code Playgroud)
怎么self办?这是什么意思?这是强制性的吗?
该__init__方法有什么作用?为什么有必要?(等等.)
我认为它们可能是OOP结构,但我不太了解.
我通过一些pygame教程学习Python .
在那里我发现了关键字self的广泛使用,并且来自主要的Java背景,我发现我一直忘记键入self.例如,而不是self.rect.centerx我要输入rect.centerx,因为对我来说,rect已经是类的成员变量.
对于这种情况,我可以想到的Java并行是必须使用此前缀对成员变量的所有引用作为前缀.
我是否坚持使用self为所有成员变量添加前缀,或者有没有办法声明它们可以让我避免这样做?
即使我建议的不是pythonic,我仍然想知道它是否可能.
我已经看过这些相关的SO问题,但他们并没有完全回答我的想法:
而不是每次我定义一个类时都编写这样的代码:
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)
两个问题:
说,我在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类添加一个新成员时,我都被迫修改构造函数.
通常__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)
还不错..
我需要创建一个带有很多参数的类.
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方式吗?
通常,类的构造函数将获取它的参数并将它们保存在实例上.例如:
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)
我的问题如下:
是否有一种标准方法将定义的所有参数传递__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 ×8
constructor ×2
oop ×2
self ×2
attributes ×1
decorator ×1
list ×1
parameters ×1
python-3.x ×1
setattr ×1