相关疑难解决方法(0)

python中类变量的继承

试图在python中理解oop我遇到了困扰我的情况,我无法找到令人满意的解释......我正在构建一个Countable类,它有一个计数器属性,可以计算该类有多少个实例已初始化.我希望在初始化给定类的子类(或子类)时也增加此计数器.这是我的实现:

class Countable(object):
    counter = 0
    def __new__(cls, *args, **kwargs):
        cls.increment_counter()
        count(cls)
        return object.__new__(cls, *args, **kwargs)

    @classmethod
    def increment_counter(cls):
        cls.counter += 1
        if cls.__base__ is not object:
            cls.__base__.increment_counter()
Run Code Online (Sandbox Code Playgroud)

哪里count(cls)有调试目的,后来我把它写下来.

现在,让我们有一些这样的子类:

class A(Countable):
    def __init__(self, a='a'):
        self.a = a

class B(Countable):
    def __init__(self, b='b'):
        self.b = b

class B2(B):
    def __init__(self, b2='b2'):
        self.b2 = b2

def count(cls):
    print('@{:<5}  Countables: {}  As: {}  Bs: {}  B2s: {}'
          ''.format(cls.__name__, Countable.counter, A.counter, B.counter, B2.counter))
Run Code Online (Sandbox Code Playgroud)

当我运行如下代码时:

a = A()
a = A()
a …
Run Code Online (Sandbox Code Playgroud)

python inheritance class-variables python-2.7

7
推荐指数
1
解决办法
3623
查看次数

如何在Celery中获取所有任务和定期任务

可能重复:
如何在Python中找到给定类的所有子类?

在我的Django项目中,我有一些Celery的子类,Task并且PeriodicTask:

class CustomTask(Task):
    # stuff

class CustomPeriodicTask(PeriodicTask):
    # stuff
Run Code Online (Sandbox Code Playgroud)

我需要所有Task类来添加一些自定义日志记录配置.所以我认为我可以__subclasses__,但这不起作用:

>>> Task.__subclasses__()
[<unbound PeriodicTask>, <class handle_register of <Celery default:0xa1cc3cc>>]
Run Code Online (Sandbox Code Playgroud)

是它在某种程度上可能得到所有我TaskPeriodicTask子类以动态的方式?

python django celery

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

列出来自不同文件的子类

让我们考虑一个应用程序,其中有一个基类 Move 及其变体 Walk 和 Run。我想将它们分成不同的类。我还希望能够从基类中获取可能的动作列表。就像是:

模块 1:

class Move(object): pass
Run Code Online (Sandbox Code Playgroud)

模块 2:

from module1 import Move
class Walk(Move): pass
Run Code Online (Sandbox Code Playgroud)

主要脚本:

from module1 import *
from module2 import *
print Move.__subclasses__()
Run Code Online (Sandbox Code Playgroud)

如果没有这两个导入行,main将不会返回任何子类。这似乎是预期的行为。

我希望将来能够添加更多的运动模块,而无需修改现有的源代码。

我正在考虑发现并导入给定目录中的所有 python 文件,类似于此处所做的操作:Python __subclasses__() notlisting subclasses

有没有更干净的方法来完成这样的任务?

python module subclass

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

使类可迭代尊重继承

使用元类(这里有一些其他答案),简单地使类可迭代很容易.但是我希望使一个类可迭代,并且还允许一个"基于继承迭代一个子组".我使用的一个例子:

class IterPartRegistry(type):
    def __iter__(cls):
        return iter(cls._registry)


class A(object, metaclass=IterPartRegistry):
    _registry = []
    def __init__(self, name):
        self.name = name
        self._registry.append(self)

class B(A):
    pass

class C(A):
    pass


A("A - first")
B("B - first")
B("B - second")
C("C - first")

for t in A:
    print(t.name)

print(" --- ")
for t in B:
    print(t.name)

exit()
Run Code Online (Sandbox Code Playgroud)

第一个循环起作用 - 它遍历"A"的所有实例和子节点.但是,第二个循环应仅在"A"的特定子组上运行 - 那些是子项"B"的实例(或者是在线下的子项).

(如何)这可以实现最简单?通过这种方式添加更多子类需要最少量的工作/更改?

python inheritance iterable metaclass

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

python - 如何获取内部类的列表?

我正在编写一个小型 Python 应用程序,其中包含一些嵌套类,如下例所示:

class SuperBar(object):
    pass

class Foo(object):
    NAME = 'this is foo'

    class Bar(SuperBar):
        MSG = 'this is how Bar handle stuff'

    class AnotherBar(SuperBar):
        MSG = 'this is how Another Bar handle stuff'
Run Code Online (Sandbox Code Playgroud)

我使用嵌套类来创建某种层次结构,并提供一种干净的方法来实现解析器的功能。

在某些时候,我想创建一个内部类的列表。我想要以下输出:

[<class '__main__.Bar'>, <class '__main__.AnotherBar'>]
Run Code Online (Sandbox Code Playgroud)

问题是:以 pythonic 方式获取内部类列表的推荐方法是什么?

python metaclass inner-classes python-2.7 python-3.x

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

Python - 迭代扩展类的类列表?

我有一个特定的类,即Animal,以及几个子类Dog,如CowLion、 等。

Animal是一个抽象类,它有一个抽象静态方法eats(Food f)

所有这些子类都会实现eats,并且根据每种动物的不同,将返回TrueFalse.

我如何迭代每个类别并创建一个新的特定食物Animal类型eats,而无需手动输入每个类别?

例如,我想获得一个Animal吃草类型的对象,而不实际创建一个新的Cow.

查找 的子类Animal可能是一部分,但我更感兴趣的是实际迭代某种类列表并eats在每个类上运行,直到找到一个返回 True 的子类,然后创建该类的一个新对象。

谢谢。

python class

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

将 __builtins__ 恢复为默认值

如果我编码错误并且我会这样做:

__builtins__ = 'abcd'
Run Code Online (Sandbox Code Playgroud)

在我没有编码之前import builtins有没有办法恢复__builtins__到默认值?

python python-3.x

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

获取GAE Python中所有NDB模型名称(类名称)的列表

如何在GAE Python中获取所有NDB模型名称的列表?

所有NDB模型都是继承自的Python类ndb.Model.我想我们可以使用这些信息来获取所有模型的名称.

class BK (ndb.Model): 
    property_1 = ..
Run Code Online (Sandbox Code Playgroud)

我尝试下面(借用)代码,但徒劳无功:

ATTEMPT 1

logging.info ( [ cls.__name__ for cls in globals()['ndb.Model'].__subclasses__() ] )
Run Code Online (Sandbox Code Playgroud)

它导致错误:

KeyError:'ndb.Model'

ATTEMPT 2

logging.info ( [ cls.__name__ for cls in globals()['Model'].__subclasses__() ] )
Run Code Online (Sandbox Code Playgroud)

它导致错误:

KeyError:'模型'

python google-app-engine google-cloud-datastore

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

一个Python Puzzler

如果你对如何在python中执行以下任务有任何建议,我就在徘徊:假设我有以下类:

class A(object): 
    self._classes = []
    def magic(self):
        c.foo() for c in self._classes

class B(object):
    def foo():'''some cool stuff here'''

class C(B):
    def foo():'''very cool stuff'''

class D(B):
    def foo():'''very cool stuff'''
Run Code Online (Sandbox Code Playgroud)

我想要做的是当A类被实例化时,所有类型的B - (C和D)将在self._classes中被实例化,这意味着_classes是[C(),D()].

这样做的一般动机是,我希望用户轻松添加类,而无需了解使用它们的类.任何帮助都会被批评.

python oop design-patterns

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