小编Ben*_*rts的帖子

Python:是否可以从父类的实例构造子类的实例?

这可能是一个糟糕的想法(随时告诉我它是否可以),但我正在探索Python的界限,我可以看到它是如何有用的(事实上,我正在研究它的潜在案例)马上).

这是设置:

---(API文件)---

class APINode(object):
    def __init__(self, *args, **kwargs):
        # initialize some instance variables

    def render(self, arg1, arg2):
        # do some stuff and return something

def api_function( arg1, arg2 ):
    # do some stuff
    return APINode(args, kwargs)
Run Code Online (Sandbox Code Playgroud)

----(我的档案)----

class MyNode(APINode):
    def render(self, arg1, arg2):
        #My override of APINode's render 


def my_function( arg1, arg2 ):
    api_parent_instance = api_function( arg1, arg2 )
    #Can I some how create an instance of MyNode from api_parent_instance here?
Run Code Online (Sandbox Code Playgroud)

我想稍微修改api_function的输出,基本上只是为了覆盖它返回的对象中的render函数.我觉得我的选择是:(1,yuck)将api_function的内容复制到my_function中,但只是构造并返回一个MyNode而不是一个APINode,或者(2,可能?)只是从my_function调用api_function,让它做它的工作 - 构造和返回一个APINode类型的对象,然后我可以以某种方式从该对象创建一个MyNode,以覆盖该方法.

它归结为:在Python中,是否可以从父类的实例构造子类的实例?

(看起来很熟悉或想知道实际情况是什么?我正在尝试扩展Django模板标签.)

python inheritance

6
推荐指数
1
解决办法
1273
查看次数

QUnit,Sinon.js和Backbone单元测试失败:sinon间谍似乎未能检测到Backbone Model事件回调

在以下单元测试代码中:

TestModel = Backbone.Model.extend({
    defaults: {
        'selection': null
    },
    initialize: function() {
      this.on('change:selection', this.doSomething);
    },
    doSomething: function() {
        console.log("Something has been done.");
    }
});

module("Test", {
    setup: function() {
        this.testModel = new TestModel();
    }
});

test("intra-model event bindings", function() {
    this.spy(this.testModel, 'doSomething');
    ok(!this.testModel.doSomething.called);
    this.testModel.doSomething();
    ok(this.testModel.doSomething.calledOnce);
    this.testModel.set('selection','something new');
    ok(this.testModel.doSomething.calledTwice); //this test should past, but fails.  Console shows two "Something has been done" logs.
});
Run Code Online (Sandbox Code Playgroud)

第三个ok失败,即使该函数是从主干事件绑定中有效调用的,如控制台演示的那样.

第3次测试失败 在此输入图像描述

这非常令人沮丧,并且让我对sinon.js是否适合测试我的骨干应用程序感到震惊.我做错了什么,或者这是一个问题,sinon如何检测是否已经调用了某些东西?有解决方法吗?

编辑:这是我的具体例子的解决方案,基于接受答案的猴子补丁方法.虽然它在测试中有几行额外的设置代码,(我不再需要模块功能)但它完成了工作.谢谢,mu is too short

test("intra-model event bindings", function() {
    var that = this;
    var …
Run Code Online (Sandbox Code Playgroud)

javascript qunit backbone.js sinon

6
推荐指数
1
解决办法
3630
查看次数

为什么requirejs试图将'.js'附加到.j插件加载的.jst模板文件?

我对模板文件使用.jst扩展名,并使用requirejs文本加载它们!插入.例如,

define([
  'jquery',
  'backbone',
  'underscore',
  'text!templates/MyView.jst'
],
function($, Backbone, _, templateText) {
  return Backbone.View.extend({
    template: _.template(templateText),
    initialize: function() {

    },
    render: function() {
    }
  });
});
Run Code Online (Sandbox Code Playgroud)

当我在本地测试时,这会起作用.但是,当我在将静态文件部署到AWS(应用程序的动态部分在Heroku上运行)后尝试执行此操作时,它无法加载.jst文件并且似乎试图将.js附加到他们的网址.

供参考,这是我的requirejs配置(来自main.js)

requirejs.config({
  paths: {
    //directories
    plugins: "lib/plugins",

    //libs
    jquery: "lib/jquery/1.7.1/jquery",
    underscore: "lib/underscore/1.3.3/underscore",
    backbone: "lib/backbone/0.9.2/backbone",
    moment: "lib/moment",  // date lib

    //require plugins
    text: "lib/require/plugins/text",
    domReady: "lib/require/plugins/domReady"
  },
  shim: {  //specify all non-AMD javascript files here.
    backbone: {
        deps: ['underscore', 'jquery'],
        exports: 'Backbone'
    },
    underscore: {
        exports: '_'
    },
    moment: {
        exports: 'moment'
    },
    'plugins/jquery.colorbox': …
Run Code Online (Sandbox Code Playgroud)

javascript requirejs

6
推荐指数
1
解决办法
2026
查看次数

如何在python中一般地将函数的重写应用于多个类?

我正在研究一个Django应用程序,但这似乎只是一个python问题,没有必要特定于Django.我是python的新手,很难描述我想要做什么,但更容易展示,所以这里:

我有一节课:

class SlideForm(ModelForm):

    class Meta:
        model = Slide
Run Code Online (Sandbox Code Playgroud)

我的子类:

class HiddenSlideForm(SlideForm):
    def __init__(self, *args, **kwargs):
        super(HiddenSlideForm, self).__init__(*args, **kwargs)
        for name, field in self.fields.iteritems():
            field.widget = field.hidden_widget()
            field.required = False
Run Code Online (Sandbox Code Playgroud)

然后我又上了一堂课:

class DeckForm(ModelForm):     

    def __init__(self, *args, **kwargs):
        # do some stuff here
        return super(DeckForm, self).__init__(*args, **kwargs)

    class Meta:
        model = Deck
        # other stuff here  
Run Code Online (Sandbox Code Playgroud)

其中我也分类:

class HiddenDeckForm(DeckForm):

    def __init__(self, *args, **kwargs):
        super(HiddenDeckForm, self).__init__(*args, **kwargs)
        for name, field in self.fields.iteritems():
            field.widget = field.hidden_widget()
            field.required = False
Run Code Online (Sandbox Code Playgroud)

请注意,子类具有与类名称完全相同的代码,并执行完全相同的操作.我一直在试图弄清楚什么是最好的通用化方法,所以我可以保持干燥并轻松地将它用于其他类,并考虑装饰器和/或多重继承 - 这两个对我来说都是新概念 - …

python django inheritance decorator

5
推荐指数
1
解决办法
979
查看次数

Django Admin - 自定义更改列表视图

我需要向Django Admin添加自定义视图.这应该类似于特定模型的标准ChangeList视图,但具有自定义结果集.(我需要显示所有具有某个日期其他日期的模型比今天少,但这并不是真正相关的).

我可以这样做的一种方法是使用Admin queryset方法,比如

class CustomAdmin(admin.ModelAdmin):
    ...
    def queryset(self, request):
        qs = super(CustomAdmin, self).queryset(request)
        if request.path == 'some-url':
            today = date.today()
            # Return a custom queryset
        else:
            return qs
Run Code Online (Sandbox Code Playgroud)

这确保......

问题是我不知道如何绑定some-url到标准的ChangeList视图.

django django-admin

5
推荐指数
1
解决办法
4379
查看次数

如果我为未被推送的提交推送标签会发生什么

我正在使用部署脚本,当我部署时,会自动向HEAD添加标签(通过'git tag -f ...')来指示主机.该脚本会自动推送标记(通过'git push --tags'),因此存储库的其他用户将知道服务器当前正在运行的提交.通常,我会在部署之前(手动)推送提交,因此标记将匹配远程服务器上的提交,但我很好奇如果我通过'git push --tags推送提交标记会发生什么',提交本身尚未被推送.

git

5
推荐指数
2
解决办法
392
查看次数

有没有办法在模板中动态呈现django字段的隐藏版本?

Introspection告诉我django字段有一个"hidden_​​widget"属性.也许它不是这个属性的给定目的,但它的存在诱惑我在模板中使用它来有条件地渲染隐藏的小部件.例如,

{% if some condition %} 
   {{ form.my_field }} 
{% else %} 
   {{ form.my_field.hidden_widget }} 
{% endif %}
Run Code Online (Sandbox Code Playgroud)

但这不起作用.是否可以通过这种方式使用隐藏的小部件?我错过了什么?

我意识到我可以通过动态设置我的自定义Form类的init中的小部件来实现这一点,这是基于条件的一些自定义kwarg,我传入它,但上面的解决方案(在模板中动态呈现隐藏的小部件)将如果它可用,那就更简单了.

django django-templates

5
推荐指数
1
解决办法
819
查看次数

猴子补丁在尝试使用对象的特定属性时引发AttributeError

我有一个python类的实例.

class Fum(object):
  foo = Foo()
  bar = Bar()

fum = Fum()
Run Code Online (Sandbox Code Playgroud)

出于好的理由,我不想进入,我想修补这个对象,以便它的某个属性在某个用例中是禁止的.我希望如果我或其他开发人员尝试在猴子修补对象上使用该属性,则会引发一个有用的异常来解释这种情况.我试图用一个属性实现这个,但我没有运气.

例如,

def raiser():
  raise AttributeError("Don't use this attribute on this object. Its disabled for X reason.")

fum.bar = property(raiser)

>>> fum.bar
>>> <property object at 0xb0b8b33f>
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

python

5
推荐指数
1
解决办法
1438
查看次数

可以在Django中做条件ForeignKey.on_delete吗?

通过on_delete选项,Django为具有要删除对象的外键的对象提供了多种选择

我想知道是否有办法可以有条件地做类似的事情。这是场景。我正在使用Django 1.5的新自定义用户模型,并且我所有的用户都有一个ForeignKey到Site。像这样:

class TenantSiteUser(AbstractUser):
  site = models.ForeignKey(Site, null=True)
Run Code Online (Sandbox Code Playgroud)

如果删除了站点,那么我宁愿删除链接到该站点的所有非超级用户(例如,类似KASKADE的行为),因为它们的存在现在已经毫无意义。但是,如果它是超级用户,我宁愿只是将用户的网站设置为null(即SET_NULL)并让它们保持存在,因为这可能是我或与我合作的人,并且我们不希望无意间删除自己。

我可以重写一些内容来手动执行检查并实现这种on_delete行为吗?

编辑:这是基于@Kevin的答案以及对现有处理程序如何工作的一些研究而最终为我工作的代码:

def NULLIFY_SUPERUSERS_ELSE_CASCADE(collector, field, sub_objs, using):
    superusers = []
    for user in sub_objs:
        if user.is_superuser:
            sub_objs = list(sub_objs)
            sub_objs.remove(user)
            superusers.append(user)

    CASCADE(collector, field, sub_objs, using)
    if len(superusers):
        collector.add_field_update(field, None, superusers)

class TenantSiteUser(AbstractUser):
    site = models.ForeignKey(Site, null=True, on_delete=NULLIFY_SUPERUSERS_ELSE_CASCADE)
Run Code Online (Sandbox Code Playgroud)

django

5
推荐指数
1
解决办法
871
查看次数

在特定窗口宽度下呈现Google Chrome中的错误

我的用户和我只在Chrome中遇到渲染故障(在Windows和Mac上),其中我用于悬停工具提示式"弹出窗口"的重叠div(请参见下面的第一张图片)无法正确呈现在某些情况下(见下面的第二张图).在我测试的所有其他浏览器中,它按预期工作.

以下是悬停弹出窗口的外观(以及Firefox,Safari,IE中发生的情况):

Safari:很好

以下是Chrome中发生的情况:

Chrome:不好

如果你在5月24日使用浏览器窗口宽度~1200px(显然更宽或更窄的窗口似乎不起作用),你可以在这个网站上看到它的实际运行情况.毛刺只会影响左侧弹出的菜单右下角的弹出窗口,例如5月24日出现的弹出窗口.在页面中较高的位置使用相同的精确机制.Glitched弹出窗口是不可见的(除了部分克拉),但是如果你点击链接将弹出窗口固定到位,然后在移动鼠标的同时按住左键,就好像要在弹出窗口应该选择的区域中选择"选择文本"然后,它将部分呈现.此外,如果我打开开发工具并尝试选择弹出窗口,它将在那时呈现正常.

我一整天都在关注这个问题并尝试使用不透明度,z-index等进行不同的工作,并且无处可去.这个小故障会给任何人敲响声吗?一旦定位和取消隐藏,有没有办法强制Chrome渲染div?任何解决方法或黑客行为我都没问题.

我为弹出窗口使用自定义(并且相当复杂)的jquery插件.如果看到插件的非缩小javascript会很有帮助,我可以发布或提供一个链接,但是导致我解决的一般指导将足以被接受作为答案.

编辑:我的浏览器版本:26.0.1410.65

html javascript css google-chrome tooltip

5
推荐指数
1
解决办法
1582
查看次数