相关疑难解决方法(0)

在运行时创建Python类的最不好的方法是什么?

我正在使用一个接受类作为输入的ORM,我需要能够为它提供一些动态生成的类.目前,我正在做这样一个人为的例子:

def make_cls(_param):
   def Cls(object):
       param = _param
   return Cls

A, B = map(make_cls, ['A', 'B'])

print A().foo
print B().foo
Run Code Online (Sandbox Code Playgroud)

虽然这样可以正常工作,但感觉有点偏差:例如,两个类都<class '__main__.Cls'>在repl上打印.虽然名称问题不是什么大问题(我想我可以通过设置解决它__name__),但我想知道是否还有其他我不知道的事情.所以我的问题是:有没有更好的方法来动态创建类或者我的示例已经很好了?

python class

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

在创建Python类时调用类方法

我想在类创建时自动运行一些可以调用其他类方法的代码.我没有在类声明本身中找到这样做的方法,并最终创建一个@classmethod被调用__clsinit__并在类声明后立即从定义范围调用它.是否有一个我可以定义的方法,以便在创建类对象后自动调用它?

python initializer class-method

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

需要了解__init __,__ new__和__call__的流程

class Singleton(type):
    def __init__(self, *args, **kwargs):
        print 'calling __init__ of Singleton class', self
        print 'args: ', args
        print 'kwargs: ', kwargs
        super(Singleton, self).__init__(*args, **kwargs)
        self.__instance = None
    def __call__(self, *args, **kwargs):
        print 'running __call__ of Singleton', self
        print 'args: ', args
        print 'kwargs: ', kwargs, '\n\n'
        if self.__instance is None:
            self.__instance = super(Singleton, self).__call__(*args, **kwargs)
        return self.__instance

class A(object):
    __metaclass__ = Singleton
    def __init__(self,a):
        print 'in __init__ of A:  ', self
        self.a = a
        print 'self.a: ', self.a

a=A(10)
b=A(20) …
Run Code Online (Sandbox Code Playgroud)

python singleton design-patterns metaclass

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

为什么django模型类不是"类型"类型?

使用python manage.py shell在django项目根目录下打开python shell,并观察以下内容:

>>> class A(object): pass #checking type of user-defined class
...
>>> type(A)
<type 'type'>
>>> class B(A): pass #checking type of child class
>>> type(B)
<type 'type'>
>>> from collections import OrderedDict #checking type of imported class
>>> type(OrderedDict)
<type 'type'>
Run Code Online (Sandbox Code Playgroud)

现在看看这个:

>>> from my_project.models import MyModel
>>> type(MyModel)
<class 'django.db.models.base.ModelClass'>
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下这里发生了什么吗?Django模型明确定义为models.py中的类:

class MyModel(models.Model):
  pass
Run Code Online (Sandbox Code Playgroud)

那么为什么它们在进口时不属于"类型"?Django是通过一些黑色魔法改变模型类型的,还是我只是遗漏了一些明显的东西?

python django

8
推荐指数
0
解决办法
369
查看次数

为什么`__subclasshook__`可以被monkeypatched到元类上,但`__instancecheck__`不能?

这是一个尝试创建装饰器的玩具示例,该装饰器允许声明属性名称,这些属性名称应该是标准__subclasshook____instancecheck__模式中"接口检查"的必要部分.

当我装饰这个Foo类时,它似乎按预期工作.我创建了一个Bar与之无关的类,Foo但它具有所需的属性,并且它正确地满足isinstance(instance_of_bar, Foo) == True.

但是作为另一个例子,我创建了一个dict扩充的子类,以便key可以使用getattr语法访问这些值(例如dict,d['a']可以替换d.a为可获得相同结果的where ).在这种情况下,属性只是实例属性,因此__instancecheck__应该工作.

这是代码.请注意,鉴于具有Bar工作实例的示例,将__subclasshook__函数"monkeypatch"选择到Foo类(具有元类)中的选择正常.因此,似乎不必直接在元类的类定义中定义函数.

#Using Python 2.7.3

import abc
def interface(*attributes):
    def decorator(Base):

        def checker(Other):
            return all(hasattr(Other, a) for a in attributes)

        def __subclasshook__(cls, Other):
            if checker(Other):
                return True
            return NotImplemented

        def __instancecheck__(cls, Other):
            return checker(Other)

        Base.__subclasshook__ = classmethod(__subclasshook__)
        Base.__instancecheck__ = classmethod(__instancecheck__) …
Run Code Online (Sandbox Code Playgroud)

python interface subclass abc

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

访问父类中的子类变量

我有一个父类和一个继承的子类,我想知道如何访问父类中的子类变量..

我试过这个,但失败了 -

class Parent(object):
    def __init__(self):
        print x

class Child(Parent):
    x = 1;            

x = Child();
Run Code Online (Sandbox Code Playgroud)

错误:-

NameError: global name 'x' is not defined
Run Code Online (Sandbox Code Playgroud)

这个问题与我们继承表单类并声明一些类变量的 Django 表单有关。

例如:-

我的表格看起来像这样

from django import forms

class EmployeeForm(forms.Form):
      fname = forms.CharField(max_length=100)
      lname = forms.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

我相信表单字段被视为类变量并以某种方式传递给父类..

python django

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

覆盖__init__.py中的len - python

我想__init__.py通过以下方式为我的包的文件中的另一个函数分配另一个函数:

llen = len
len = lambda x: llen(x) - 1
Run Code Online (Sandbox Code Playgroud)

它工作正常,但只在__init__.py文件中.如何让它影响我的包中的其他模块?

python monkeypatching built-in shadowing

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

在python中访问超(父)类变量

我是python的新手。我试图使用 super() 方法访问子类中的父类变量,但它抛出错误“无参数”。使用类名访问类变量有效,但我想知道是否可以使用 super() 方法访问它们。

class Parent(object):
        __props__ = (
            ('a', str, 'a var'),
            ('b', int, 'b var')
        )

        def __init__(self):
            self.test = 'foo'

class Child(Parent):
    __props__ = super().__props__ + (
        ('c', str, 'foo'),
    ) # Parent.__props__


    def __init__(self):
        super().__init__()
Run Code Online (Sandbox Code Playgroud)

错误:

    __props__ = super().__props__ + (
RuntimeError: super(): no arguments
Run Code Online (Sandbox Code Playgroud)

python class python-3.x

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

如果将基类的可选功能存储在二级类中,二级类是否应该继承基类?

我知道标题可能有点混乱,所以让我举个例子。假设您有一个基类Base,它旨在被子类化以创建更复杂的对象。但是您还有一些可选功能,您不需要每个子类都需要这些功能,因此您将它放在一个二级类中OptionalStuffA,该二级类始终打算与基类一起进行子类化。你也应该让那个次要类成为 的子类Base吗?

这当然是唯一相关,如果你有一个以上的OptionalStuff班,你想给他们以不同的方式结合起来,否则你不需要子类均BaseOptionalStuffA(,只是有OptionalStuffA成为的一个子类Base,所以你只需要在子类OptionalStuffA)。我Base知道如果从Base.

下面是一个示例场景。我还将QObject该类作为“第三方”令牌类放入该类,其功能对于其中一个辅助类工作是必需的。我在哪里子类化它?下面的例子显示了我到目前为止是如何做到的,但我怀疑这是要走的路。

from PyQt5.QtCore import QObject

class Base:
    def __init__(self):
        self._basic_stuff = None

    def reset(self):
        self._basic_stuff = None


class OptionalStuffA:
    def __init__(self):
        super().__init__()
        self._optional_stuff_a = None

    def reset(self):
        if hasattr(super(), 'reset'):
            super().reset()
        self._optional_stuff_a = None

    def do_stuff_that_only_works_if_my_children_also_inherited_from_Base(self):
        self._basic_stuff = not None


class OptionalStuffB:
    def __init__(self):
        super().__init__()
        self._optional_stuff_b = None

    def reset(self):
        if hasattr(super(), 'reset'): …
Run Code Online (Sandbox Code Playgroud)

python multiple-inheritance method-resolution-order

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

为什么从Base继承的SQLAlchemy类不需要构造函数?

使用继承自Base类的SQLAlchemy对象,我可以将参数传递给类,而不是在构造函数中定义的变量:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))

    def __repr__(self):
        return "<User(name='%s', fullname='%s', password='%s')>" % (
                                self.name, self.fullname, self.password)

ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
Run Code Online (Sandbox Code Playgroud)

当然,如果我尝试将这样的参数传递给另一个类,以同样的方式设置类变量我会收到错误:

In [1]: class MyClass(object):
   ...:     i = 2
   ...:     

In [2]: instance = MyClass(i=9)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-6d3ec8445b00> in <module>()
----> 1 instance = MyClass(i=9)

TypeError: object.__new__() takes no …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

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