相关疑难解决方法(0)

Python中的原型编程

Javascript为其对象使用基于原型的模型.尽管如此,该语言非常灵活,并且很容易用几行函数编写,这些函数替换了构造上的其他类型.例如,可以创建一个class函数,模拟标准类行为,包括继承或私有成员.或者可以通过编写一个curry函数来模仿功能工具,例如,一个函数将获取一个函数及其一些参数并返回部分应用的函数.

我想知道是否可以反过来模仿更古典语言中的原型方法.特别是我一直在思考是否有可能在Python中模仿原型,但缺乏对匿名函数的支持(比lambdas更常见)让我陷入困境.

是否有可能编写一些函数来模仿基于类的语言中的指标,特别是在Python中?

编辑让我举一个例子,说明如何实现这样的事情(但我真的无法做到这一切).

首先,最接近Javascript对象的东西是Python字典.所以我们可以有简单的对象

foo = {
    'bar': 1,
    'foobar': 2
}
Run Code Online (Sandbox Code Playgroud)

当然我们想要添加方法,只要该方法适合lambda,这就不是问题

foo = {
    'bar': 1,
    'foobar': 2,
    'method': lambda x: x**2
}
Run Code Online (Sandbox Code Playgroud)

所以现在我们可以打电话了

foo['method'](2)
>>> 4
Run Code Online (Sandbox Code Playgroud)

现在,如果我们有任意函数作为方法,我们就可以继续这样做.首先,我们需要内部的功能foo才能访问foo自己; 否则它们只是普通的功能,而不是方法.

我想可以通过应用一个makeObject函数来实现这一点,该函数foo循环遍历foo值,并且每当找到可调用的值时,修改其__call__属性以foo作为其第一个参数传递.

在这个阶段,我们将拥有自立对象,可以在不需要创建类的情况下声明它们.

然后我们需要能够给出foo一个原型,它可以作为makeObject函数的第二个参数传递.该函数应该修改foo.__getattr__foo.__setattr__如下:每当找不到属性时foo,应该搜索它foo.prototype.

因此,我认为我能够实现这一点,期待一件事:我想不出任何方法来声明方法比lambdas更复杂,除了事先声明它们并将它们附加到我的对象.问题是缺乏匿名功能.我在这里问,因为也许一些Python大师可以找到一些聪明的方法来规避这个.

javascript python inheritance prototype prototypal-inheritance

9
推荐指数
2
解决办法
2903
查看次数

覆盖python中的类变量?

下面,base_id_id是一个类变量,并在所有子类之间共享.
有没有办法将它们分成每个类?

from itertools import count

class Parent(object):
    base_id = 0
    _id = count(0)

    def __init__(self):
        self.id = self.base_id + self._id.next()


class Child1(Parent):
    base_id = 100
    def __init__(self):
        Parent.__init__(self)
        print 'Child1:', self.id

class Child2(Parent):
    base_id = 200
    def __init__(self):
        Parent.__init__(self)
        print 'Child2:', self.id

c1 = Child1()                   # 100
c2 = Child2()                   # 201 <- want this to be 200
c1 = Child1()                   # 102 <- want this to be 101
c2 = Child2()                   # 203 <- …
Run Code Online (Sandbox Code Playgroud)

python class

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

在class属性中引用类名的最佳方法是什么?

不幸的是,在Python中,类属性不能引用其类名.以下引发了一个名称错误:

class Foo(object):
    bar = Foo
Run Code Online (Sandbox Code Playgroud)

在class属性必须引用其类名的情况下(在我的情况下,它是库的验证方案的一部分),最清楚的方法是什么?

以下是我目前的尝试:

class Foo(object):
    bar = None
Foo.bar = Foo
Run Code Online (Sandbox Code Playgroud)

这是有效的,但即使使用注释也可能会引起混淆,因为您希望在声明时初始化类属性,而不是在声明类之后.

有没有人有更好的解决方法?

python

9
推荐指数
2
解决办法
981
查看次数

在Python中使用描述符协议时如何获取属性名称?

描述符协议工作正常但我仍然有一个问题我想解决.

我有一个描述符:

class Field(object):
    def __init__(self, type_, name, value=None, required=False):
        self.type = type_
        self.name = "_" + name
        self.required = required
        self._value = value

    def __get__(self, instance, owner):
        return getattr(instance, self.name, self.value)

    def __set__(self, instance, value):
        if value:
            self._check(value)
            setattr(instance, self.name, value)
        else:
            setattr(instance, self.name, None)

    def __delete__(self, instance):
        raise AttributeError("Can't delete attribute")

    @property
    def value(self):
        return self._value

    @value.setter
    def value(self, value):
        self._value = value if value else self.type()

    @property
    def _types(self):
        raise NotImplementedError

    def _check(self, value):
        if not isinstance(value, …
Run Code Online (Sandbox Code Playgroud)

python descriptor python-descriptors

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

当我从Python中继承实例而不是类时会发生什么?

我只是好奇当我将一个实例继承到一个类时会发生什么.

所以我尝试过:

class X:
    def __init__(self, x):
        self.x = x
    def print(self):
        print(self.x)

def inherit(obj):
    class Child(obj): # Line 20
        pass  # or maybe added functionality

    return Child

param = 5
x = X(param)
y = inherit(x) # Line 27
y.print()
Run Code Online (Sandbox Code Playgroud)

我得到(至少)以下错误:

Traceback (most recent call last):
  File "/test.py", line 27, in <module>
    y = inherit(x)
  File "/test.py", line 20, in inherit
    class Child(obj):
TypeError: __init__() takes 2 positional arguments but 4 were given
Run Code Online (Sandbox Code Playgroud)

我只是想知道:继承一个有意义/有用的实例还是简单的废话?

(这个问题有点学术性,特别是关于继承实例的细节.它不是关于对象委托或一般设计实践等替代方案.)

python inheritance class instance

9
推荐指数
2
解决办法
853
查看次数

在Python中从子级访问父类中的装饰器

如何从孩子的基类访问装饰器?

我(错误地)假设了ffg.会工作:

class baseclass(object):
    def __init__(self):
        print 'hey this is the base'

    def _deco(func):
        def wrapper(*arg):
            res = func(*arg)
            print 'I\'m a decorator. This is fabulous, but that colour, so last season sweetiedarling'
            return res
        return wrapper

    @_deco
    def basefunc(self):
        print 'I\'m a base function'
Run Code Online (Sandbox Code Playgroud)

这个类工作正常,但后来我创建了一个继承自这个的子类:

class otherclass(baseclass):
    def __init__(self):
        super(otherclass, self).__init__()
        print 'other class'


    @_deco
    def meh(self):
        print 'I\'m a function'
Run Code Online (Sandbox Code Playgroud)

这甚至不能正确导入,更不用说运行了.@_deco未定义.尝试baseclass._deco抛出一个未绑定的方法_deco()错误,这并不奇怪.

任何想法如何做到这一点,我真的想把装饰器封装在课堂上,但我没有嫁给这个想法,我需要在基础和子类中调用它.

python decorator

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

在创建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
查看次数

访问父类中的子类变量

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

我试过这个,但失败了 -

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
查看次数

如何创建元类?

我粗略地了解了什么是元类.它们是类对象所基于的类(因为类是Python中的对象).但有人可以解释(使用代码)如何创建一个.

python metaclass python-3.x

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