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
下面,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 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)
这是有效的,但即使使用注释也可能会引起混淆,因为您希望在声明时初始化类属性,而不是在声明类之后.
有没有人有更好的解决方法?
描述符协议工作正常但我仍然有一个问题我想解决.
我有一个描述符:
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) 我只是好奇当我将一个实例继承到一个类时会发生什么.
所以我尝试过:
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)
我只是想知道:继承一个有意义/有用的实例还是简单的废话?
(这个问题有点学术性,特别是关于继承实例的细节.它不是关于对象委托或一般设计实践等替代方案.)
如何从孩子的基类访问装饰器?
我(错误地)假设了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()错误,这并不奇怪.
任何想法如何做到这一点,我真的想把装饰器封装在课堂上,但我没有嫁给这个想法,我需要在基础和子类中调用它.
我想在类创建时自动运行一些可以调用其他类方法的代码.我没有在类声明本身中找到这样做的方法,并最终创建一个@classmethod被调用__clsinit__并在类声明后立即从定义范围调用它.是否有一个我可以定义的方法,以便在创建类对象后自动调用它?
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) 我有一个父类和一个继承的子类,我想知道如何访问父类中的子类变量..
我试过这个,但失败了 -
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中的对象).但有人可以解释(使用代码)如何创建一个.
python ×10
class ×2
inheritance ×2
metaclass ×2
class-method ×1
decorator ×1
descriptor ×1
django ×1
initializer ×1
instance ×1
javascript ×1
prototype ×1
python-3.x ×1
singleton ×1