相关疑难解决方法(0)

自我的目的是什么?

selfPython 中这个词的目的是什么?我理解它指的是从该类创建的特定对象,但我不明白为什么它明确需要作为参数添加到每个函数.为了说明,在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)

谁能跟我说说这个?这不是我在(无可否认的有限)经历中遇到的事情.

python oop class self

1061
推荐指数
17
解决办法
81万
查看次数

类和实例属性有什么区别?

是否有任何有意义的区别:

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)

如果您要创建大量实例,那么这两种样式的性能或空间要求是否存在差异?当您阅读代码时,您是否认为两种样式的含义有显着差异?

python attributes member-variables

127
推荐指数
4
解决办法
6万
查看次数

使用默认值初始化方法的参数

如果未将明确值传递给方法,我想用一些默认值初始化方法的参数 - 如下所示:

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

17
推荐指数
1
解决办法
4086
查看次数

Python类与模块属性

我有兴趣听一些关于Python中类属性的讨论.例如,类属性的一个很好的用例是什么?在大多数情况下,我无法想出一个类属性比使用模块级属性更可取的情况.如果这是真的,那么为什么要将它们放在一边?

我遇到的问题是,错误地破坏类属性值几乎太容易了,然后你的"全局"值变成了本地实例属性.

请随意评论您将如何处理以下情况:

  1. 类和/或子类使用的常量值.这可能包括永不改变的"幻数"字典键或列表索引,但可能需要一次性初始化.
  2. 默认类属性,在极少数情况下为类的特殊实例更新.
  3. 全局数据结构用于表示在所有实例之间共享的类的内部状态.
  4. 初始化许多默认属性的类,不受构造函数参数的影响.

一些相关帖子:
类和实例属性之间的差异

python attributes class-design module

13
推荐指数
1
解决办法
2万
查看次数

自定义占位符,如python中的None

我在一个函数中使用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'>.

有没有理由不这样做?有更好的解决方案吗?

python metaclass

7
推荐指数
2
解决办法
1435
查看次数