- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在制作一个元类,我在其中自定义 __new__
方法以根据 kwargs
中提供的值自定义如何创建新类。这在示例中可能更有意义:
class FooMeta(type):
def __new__(cls, name, bases, kwargs):
# do something with the kwargs...
# for example:
if 'foo' in kwargs:
kwargs.update({
'fooattr': 'foovalue'
})
return super(FooMeta, cls).__new__(cls, name, bases, kwargs)
我的问题是如何让它兼容 Python 2 和 3。Six是一个很好的兼容性库,但它不能解决我的问题。您可以将其用作:
class FooClass(six.with_metaclass(FooMeta, FooBase)):
pass
这不起作用,因为六使用给定的元类创建了一个新的基类。下面是 6 的代码 ( link )(从 1.3 开始):
def with_metaclass(meta, base=object):
return meta("NewBase", (base,), {})
因此,我的 __new__
方法将在没有任何 kwargs
的情况下被调用,因此基本上“破坏”了我的功能。问题是如何在不破坏 Python 2 和 3 的兼容性的情况下完成我想要的行为。请注意,我不需要 Python 2.6 支持,所以如果只有 Python 2.7.x 和 3.x 有可能的话,我是没关系。
背景
我需要这个才能在 Django 中工作。我想创建一个模型工厂元类,它根据模型属性自定义模型的创建方式。
class ModelMeta(ModelBase):
def __new__(cls, name, bases, kwargs):
# depending on kwargs a different model is constructed
# ...
class FooModel(six.with_metaclass(ModelMeta, models.Model):
# some attrs here to be passed to the metaclass
最佳答案
如果我没理解错的话,那就没问题了,它已经可以工作了。您是否真的检查过您的元类是否具有预期的效果?因为我认为它已经做到了。
with_metaclass
返回的类并不意味着扮演您的类 FooClass 的角色。它是一个虚拟类,用作您的类的基类。由于此基类属于元类 FooMeta,您的派生类也将具有元类 FooMeta,因此将使用适当的参数再次调用元类。
class FooMeta(type):
def __new__(cls, name, bases, attrs):
# do something with the kwargs...
# for example:
if 'foo' in attrs:
attrs['fooattr'] = 'foovalue'
return super(FooMeta, cls).__new__(cls, name, bases, attrs)
class FooBase(object):
pass
class FooClass(with_metaclass(FooMeta, FooBase)):
foo = "Yes"
>>> FooClass.fooattr
'foovalue'
顺便说一句,将元类的第三个参数称为kwargs
会令人困惑。它不是真正的关键字参数。它是要创建的类的 __dict__
--- 即类的属性及其值。根据我的经验,此属性通常称为 attrs
或 dct
(参见例如 here 和 here)。
关于使用 kwargs 时的 Python 2 和 3 元类兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16629533/
我有一个像 s = "title='bah' name='john and jill' purple='haze' none=None i=1" 我正在寻找一种将其放入字典的 Pythonic 方式(
我正在通过教程阅读有关模板 View 的内容,其中一些代码让我感到困惑。作者使用了这个代码示例 from django.utils.timezone import now class AboutUsV
看不懂下面的例子,假设我有这些功能: # python likes def save(filename, data, **kwargs): fo = openX(filename, "w",
假设我们有一个像这样的函数声明 def myfunc(a=None,b=None): as_dict = {"a": a, "b": b,
def a(**akwargs): def b(bkwargs=akwargs): # how to not only use akwargs defaultly,but al
阅读 Python 文档,有几种创建字典的方法。 dict() dict(**kwargs) dict(mapping, **kwargs) dict(iterable, **kwargs) http
两种方法我都见过,但我不明白它们的区别以及我应该将什么作为“最佳实践”: def custom_function(**kwargs): foo = kwargs.pop('foo')
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我需要将 args 和 kwargs 都存储在一个元组中以便稍后调用,那么在这种情况下元组中的适当值是 *args 还是 args?换句话说,这行得通吗: def __init__(self, *ar
我有这个查询 Location.objects.filter(locations_rate__rate=search_rate).distinct('id') 如何将 distinct() 设置为 *
是否可以简化 kwargs 选项的 bool 检查? 例如在 foo 中我必须检查很多选项: def foo(*args, **kwargs): if 'foo' in kwargs and k
我尝试运行 Python Data Science Essential 一书中的一个示例。但是,当我运行它时出现错误。实际上,我才刚刚开始学习 python。所以,我觉得很难修复这些错误。请帮我。这是
我正在尝试使用以下代码在一个大图中创建多个seaborn regplot: %matplotlib notebook import seaborn as sns from itertools impo
我有一个这样的函数:。如果有参数x,则它一定是布尔值。任何其他命名参数必须为int。。其他人将编写调用foo的函数,我希望他们能够传递x和kwargs。目前,这意味着调用foo()的每个函数除了kwa
当一个类继承自单个类时,调用父方法的首选方式是什么?我知道有两种调用父方法的方法。 选项 1: ParentClass.method(self, *args, **kwargs) 选项 2: supe
问题 我在 Dusty Phillips 的 Object Oriented Programming(为简洁起见而简化)中遇到了这段代码,但我不确定这个定义的特定部分。 class A: de
在创建数据类对象时我可以使用 kwargs 没有问题: @dataclass() class Data: name: str = 'Unnamed' additiona
在创建数据类对象时我可以使用 kwargs 没有问题: @dataclass() class Data: name: str = 'Unnamed' additiona
我在下面运行了一个装饰器演示。 def logger(func): def inner(*args, **kwargs): print(args) print(
如何使用“一个”类参数**kwargs设置对象属性? 我想要的是在一个循环中执行此代码: class purchase(): def __init__(self,**kwargs):
我是一名优秀的程序员,十分优秀!