self
Python 中这个词的目的是什么?我理解它指的是从该类创建的特定对象,但我不明白为什么它明确需要作为参数添加到每个函数.为了说明,在Ruby中我可以这样做:
class myClass
def myFunc(name)
@name = name
end
end
Run Code Online (Sandbox Code Playgroud)
我很容易理解.但是在Python中我需要包括self
:
class myClass:
def myFunc(self, name):
self.name = name
Run Code Online (Sandbox Code Playgroud)
谁能跟我说说这个?这不是我在(无可否认的有限)经历中遇到的事情.
是否有任何有意义的区别:
class A(object):
foo = 5 # some default value
Run Code Online (Sandbox Code Playgroud)
与
class B(object):
def __init__(self, foo=5):
self.foo = foo
Run Code Online (Sandbox Code Playgroud)
如果您要创建大量实例,那么这两种样式的性能或空间要求是否存在差异?当您阅读代码时,您是否认为两种样式的含义有显着差异?
如果未将明确值传递给方法,我想用一些默认值初始化方法的参数 - 如下所示:
class Example
def __init__(self, data = self.default_data()):
self.data = data
def default_data():
# ....
return something
Run Code Online (Sandbox Code Playgroud)
我收到了错误:
NameError: name 'self' is not defined
Run Code Online (Sandbox Code Playgroud)
我该如何解决?
我有兴趣听一些关于Python中类属性的讨论.例如,类属性的一个很好的用例是什么?在大多数情况下,我无法想出一个类属性比使用模块级属性更可取的情况.如果这是真的,那么为什么要将它们放在一边?
我遇到的问题是,错误地破坏类属性值几乎太容易了,然后你的"全局"值变成了本地实例属性.
请随意评论您将如何处理以下情况:
一些相关帖子:
类和实例属性之间的差异
我在一个函数中使用argspec,该函数将另一个函数或方法作为参数,并返回一个这样的元组:
(("arg1", obj1), ("arg2", obj2), ...)
Run Code Online (Sandbox Code Playgroud)
这意味着传递函数的第一个参数是arg1,它的默认值为obj1,依此类推.
这是一个问题:如果它没有默认值,我需要一个占位符值来表示这一点.我不能使用None,因为那时我无法区分无默认值和默认值是None.对于False,0,-1等也是如此.我可以使它成为一个单元素的元组,但是然后用于检查它的代码将是丑陋的,我不能轻易将它变成一个字典.所以我想我会创建一个非类似的非对象,这就是我想出来的:
class MetaNoDefault(type):
def __repr__(cls):
return cls.__name__
__str__ = __repr__
class NoDefault(object):
__metaclass__ = MetaNoDefault
Run Code Online (Sandbox Code Playgroud)
现在("arg1", NoDefault)
表明arg1没有默认值,我可以做类似的事情if obj1 is NoDefault:
.元类使它打印为NoDefault
而不是<class '__main__.NoDefault'>
.
有没有理由不这样做?有更好的解决方案吗?