相关疑难解决方法(0)

新式课程中的方法解决顺序(MRO)?

Python in a Nutshell(第2版)一书中,有一个示例使用
旧样式类来演示如何以经典分辨率顺序解析方法,
以及它与新顺序的不同之处.

我通过重写新样式的示例尝试了相同的示例,但结果与使用旧样式类获得的结果没有什么不同.我用来运行该示例的python版本是2.5.2.以下是示例:

class Base1(object):  
    def amethod(self): print "Base1"  

class Base2(Base1):  
    pass

class Base3(object):  
    def amethod(self): print "Base3"

class Derived(Base2,Base3):  
    pass

instance = Derived()  
instance.amethod()  
print Derived.__mro__  
Run Code Online (Sandbox Code Playgroud)

调用instance.amethod()打印Base1,但根据我对MRO的理解,新类型的输出应该是Base3.通话Derived.__mro__打印:

(<class '__main__.Derived'>, <class '__main__.Base2'>, <class '__main__.Base1'>, <class '__main__.Base3'>, <type 'object'>)

我不确定我对新样式类的MRO的理解是不正确的还是我做了一个我无法察觉的愚蠢错误.请帮助我更好地了解MRO.

python method-resolution-order

86
推荐指数
3
解决办法
5万
查看次数

python继承和在派生类的父类中使用super()

首先,我不得不为没有更好的头衔而道歉.如果您找到更合适的产品,请随意更改.

基本上,我被Python的多重继承行为所困扰.在我之前的SO问题中,我被指示阅读Python的C3 MRO.这真的有助于我更好地理解Python中的多重继承.就在我以为自己掌握了它的时候,我碰到了下面的场景,我似乎无法理解.

class UltimateBase(object):
    def check(self):
        print 'base check'

class AMixin1(UltimateBase):
    def check(self):
        print 'check A'

class BMixin1(UltimateBase):
    def check(self):
        print 'check B'

class CMixin1(UltimateBase):
    def check(self):
        print 'check C'

class AMixin2(UltimateBase):
    def check(self):
        print 'check A'
        return super(AMixin2, self).check()

class BMixin2(UltimateBase):
    def check(self):
        print 'check B'
        return super(BMixin2, self).check()

class CMixin2(UltimateBase):
    def check(self):
        print 'check C'
        return super(CMixin2, self).check()

class MyView1(AMixin1, BMixin1, CMixin1):
    pass

class MyView2(AMixin2, BMixin2, CMixin2):
    pass

class MyView3(AMixin1, BMixin2, CMixin2):
    pass …
Run Code Online (Sandbox Code Playgroud)

python multiple-inheritance python-2.7

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

Django:DRY原则和UserPassesTestMixin

我有一个名为的模型,Post并有一个字段owner(外键User).当然,只有业主可以updatedelete自己的帖子.

话虽这么说,我login_required在视图中使用装饰器来确保用户登录但是,我还需要确保用户尝试update/ delete问题是owner.

当我使用Django:Generic Editing Views时,文档说我需要使用Django:UserPassesTestMixin.

将对updatedelete视图进行此验证.干,这是怎么回事?我应该创建一个名为的类TestUserOwnerOfPost并创建一个test_func(),然后让它updatedelete视图继承吗?

因为这是我尝试过但没有用的,代码如下:

from django.views.generic.edit import UpdateView
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import UserPassesTestMixin

class TestUserOwnerOfPost(UserPassesTestMixin):                         
    def test_func(self):                                                       
        return self.request.user == self.post.owner

class EditPost(UpdateView, TestUserOwnerOfPost):                         
    model = Post                                                                         
    @method_decorator(login_required)                                          
    def dispatch(self, *args, **kwargs):                                       
        return super(EditPost, self).dispatch(*args, **kwargs)
Run Code Online (Sandbox Code Playgroud)

使用上面的代码,系统中的每个登录用户都可以edit/ delete …

python generics django

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

如何结合 Django 的“LoginRequiredMixin”和表单工具的“FormPreview”?

LoginRequiredMixin在其他基于类的视图上效果很好。表单工具也FormPreview运行良好。但是当我尝试同时使用两者时,它们LoginRequiredMixin就会被忽略。

如果我使用表单工具Django 文档中最基本的示例,情况也是如此。

我发现两件事很奇怪(但这不一定是原因):

  • “这个 mixin 应该位于继承列表的最左边。” 这听起来像是有一些内部黑客行为,如果有人做了一些不规则的事情,就会崩溃。没有解释为什么。
  • 表单工具视图应该被称为它本身,而不是方法.as_view(),这又不符合标准。

这是一个错误吗?我能做些什么?

python django django-forms django-authentication

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