试图在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中找到给定类的所有子类?
在我的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)
是它在某种程度上可能得到所有我Task和PeriodicTask子类以动态的方式?
让我们考虑一个应用程序,其中有一个基类 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
有没有更干净的方法来完成这样的任务?
使用元类(这里有一些其他答案),简单地使类可迭代很容易.但是我希望使一个类可迭代,并且还允许一个"基于继承迭代一个子组".我使用的一个例子:
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 应用程序,其中包含一些嵌套类,如下例所示:
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 方式获取内部类列表的推荐方法是什么?
我有一个特定的类,即Animal,以及几个子类Dog,如Cow、Lion、 等。
Animal是一个抽象类,它有一个抽象静态方法eats(Food f)。
所有这些子类都会实现eats,并且根据每种动物的不同,将返回True或False.
我如何迭代每个类别并创建一个新的特定食物Animal类型eats,而无需手动输入每个类别?
例如,我想获得一个Animal吃草类型的对象,而不实际创建一个新的Cow.
查找 的子类Animal可能是一部分,但我更感兴趣的是实际迭代某种类列表并eats在每个类上运行,直到找到一个返回 True 的子类,然后创建该类的一个新对象。
谢谢。
如果我编码错误并且我会这样做:
__builtins__ = 'abcd'
Run Code Online (Sandbox Code Playgroud)
在我没有编码之前import builtins有没有办法恢复__builtins__到默认值?
如何在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中执行以下任务有任何建议,我就在徘徊:假设我有以下类:
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 ×9
inheritance ×2
metaclass ×2
python-2.7 ×2
python-3.x ×2
celery ×1
class ×1
django ×1
iterable ×1
module ×1
oop ×1
subclass ×1