- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
为什么这个装饰器策略被认为是不好的? (..或者是!?)
class User(object):
def __init__(self):
self.thing = 5
def __atomic_rate_change(fn):
def wrapper(self,*args,**kwargs):
print "start magic"
self.thing += 1
fn(self,*args,**kwargs)
print "end magic"
return wrapper
@__atomic_rate_change
def foo(self,add):
print self.__atomic_rate_change # <bound method User.__atomic_rate_change of <__main__.User object at 0x6ffffe1ef50>>
self.thing += add
print "normal call {0}".format(self.thing)
test = User()
test.foo(1)
这行得通。但是,根据下面的资源,这是不好的做法。原因是:
[...] there is major flaw in this approach: atomic_rating_change becomes an instance method of the User class. That doesn’t make any sense. More than this, it doesn’t even work as a method: if you call it, the decorated parameter will be used as self.
https://medium.com/@vadimpushtaev/decorator-inside-python-class-1e74d23107f6
我不明白为什么 atomic_rate_change 是一个实例方法是个问题/错误/不好。我只打算在类里面使用装饰器。也许在这种情况下没关系?
最佳答案
在风格上,将不是方法的函数定义放入类定义中有点不合适(恕我直言,它甚至可以是非 pythonic 的)。 Flat is better than nested , 所以最好在类之外声明函数。这样,当读者查看您的类(class)时,就不会混淆为什么有一个不采用 self
的方法。作为参数(因为当函数只是一个装饰器时,它被声明为一个方法,尽管如果函数是 @staticmethod
则略有不同)。
如果您担心它会在类外使用,请在它前面加上 _
前缀然后 from my_package import *
不会导入它。它仍然可以在该模块中使用,但除非明确导入,否则不会在外部使用。
实际上,作者指的是作用域偶尔出现的奇怪行为(类似于 Javascript 中关于是否使用 function() { ...
或 () => { ...
的辩论,基于事物的作用域是如何确定的。)如果你不小心和不小心逻辑涉及 self
在装饰器的错误部分,您可能会遇到范围问题。
我能看到在类内部使用函数的唯一优点可能是因为它更接近方法(但这引入了不必要的嵌套、潜在的作用域问题以及意识到这是装饰器而不是方法的认知负担),如果函数的名称以 _
开头,则更好地隐藏该函数或 __
.
TL;DR 风格/Pythonicity 问题,以及潜在的范围问题。
关于python - 在类 "major flaw"中实现装饰器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51155928/
我想做的事情不言自明。 我的代码: public class Solution { public static void Main(String[] args) {
我有一个抽象类 Entity。每个扩展 Entity 的类都需要一些默认设置和一些可自定义的设置: public abstract class Entity { protected Entit
我最近发现一些代码使用自定义错误处理程序将任何 PHP 错误转换为通用应用程序异常。还定义了一个自定义异常处理程序,如果它在特定的错误代码范围内,它将记录异常。示例: class AppExcepti
这是 java.sql.ResultSet.next() 的签名: public boolean next() throws SQLException 众所周知,如果 ResultSet 中有更多行可
为什么这个装饰器策略被认为是不好的? (..或者是!?) class User(object): def __init__(self): self.thing = 5
为了在 Python 和图论方面训练自己,我尝试使用 Python 3 实现 Dijkstra 算法,并提交给几个在线评委,看看它是否正确。 它在很多情况下都能很好地工作,但并非总是如此。 例如,我坚
在我掌握 Windows 中用户模拟的细微差别的过程中,我首先遇到了一个关于让远程数据库发生模拟的问题(请参阅 this SO question),但我终于弄明白了。我的下一个障碍是撤消/取消/恢复(
我有一个 Spring 2.5.x 应用程序,我正在将其迁移到 Spring 3,但遇到了一个小问题。 我有一个像这样的处理程序映射:
我需要从新发现的 SQL 注入(inject)漏洞中应用最新的 Rails 安全补丁。 我正在使用 Rails 3.2.3 并找到了这个补丁文件 ( https://rubyonrails-secur
我正在监控管理一些低级网络通信的软件组件的分包供应。查看此组件我发现了这一点: public static object SyncRoot { get { return syncRoot; } } 在
在从 google gradle 插件 3.1.4 更新到现在最新的 3.2.1 后,我试图让我的应用程序重新构建,我认为我首先让我的 instantapp 工作的方法可能有问题,所以我发布这个问题是
当一位 friend 告诉我我的网站上存在安全漏洞时,我正在使用 Flask 开发一个网络应用程序。事实上,如果他在登录时转储浏览器的 cookie,注销,然后粘贴回相同的 cookie,就好像他从未
在 MVC 中,一个模型可以有多个 View ,而在 WPF 中,XAML 代码隐藏模型严格限制为 1 个 XAML( View ),难道 WPF/XAML 从一开始就没有 MVC 方面的缺陷吗? 最
Fortify SCA 工具发现一个名为“可移植性缺陷:文件分隔符”的问题,但从这些问题的根源来看,没有硬编码的文件分隔符(例如“/”或“\”),只有文件扩展名(例如“.”)。存在。 我们的客户使用
我最近重新安装了 XP,然后又安装了 SP3,目前每当我尝试从网络共享中复制某些内容时都会遇到错误。 Title: Internet Explorer Message: This page has a
我正在使用 DeepAR 算法来预测调查响应进度随时间的变化。我希望模型能够预测调查进度中接下来的 20 个数据点。每个调查都是我的训练数据中的一个时间序列。每个时间序列的长度是调查运行的 # 天。例
尽管我希望尽可能广泛地帮助 future 的编码人员,但这是一个相当具体的问题。 正如您在 this jsfiddle 中看到的那样, 这张幻灯片似乎有透明胶片图片的问题。对于透明胶片,有一个相当不和
我正尝试在我的 HTC Desire 上为我的 Android 项目执行 native 代码调试。该项目由一层薄薄的 JNI 包装器和 C++ 中的主要 block 组成,使用 ndk-build 编
在 Josh 给出的有缺陷的随机方法的示例中,该方法生成具有给定上限 n 的正随机数,我不明白他所说的两个缺陷。 书中的方法是: private static final Random rnd = n
使用 Billing API 的第 3 版,Google has removed the distinction between consumable and non-consumable produ
我是一名优秀的程序员,十分优秀!