python-3.x - 一个类只是一个模板,还是它本身也是一个实例?
问题描述
类是封装我的数据和作用于它的方法的完美对象。我只需要一个类实例。因为该类具有低于其级别的全局范围,所以我想将类名用于所有数据管理。
另一种方法是创建一个类实例,然后传递它。另一种选择是将实例设为全局,但随后人们可能会对我大喊大叫。:)
类对象的行为是否与实例完全一样?它是否保留了所有的“自我”。修改后的变量?我需要在每个方法之前添加语句'@staticmethod'吗?
解决方案
由于 Python 有一个 Read-Evaluate-Print-Loop。让我们用它来看看静态变量和成员变量之间的区别。
$ ipython 09:48:10
Python 3.6.5 (default, Mar 30 2018, 06:41:53)
Type 'copyright', 'credits' or 'license' for more information
IPython 6.1.0 -- An enhanced Interactive Python. Type '?' for help.
In [1]: class Foo:
...: DINGAS = 'Dingas'
...: def __init__(self, x):
...: self.x = x
...:
...: @staticmethod
...: def do_work(x):
...: return x + 1
...:
...: @classmethod
...: def say_hello(cls):
...: print('Hello')
In [3]: foo = Foo(1)
In [4]: foo.x
Out[4]: 1
In [5]: foo.DINGAS
Out[5]: 'Dingas'
In [6]: Foo.x
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-6-d41f169aaa8f> in <module>()
----> 1 Foo.x
AttributeError: type object 'Foo' has no attribute 'x'
In [7]: Foo.DINGAS
Out[7]: 'Dingas'
In [8]: Foo.say_hello()
Hello
如您所见,如果变量与函数处于同一级别,或者函数具有@staticmethod
or@classmethod
装饰器之一,则类的行为类似于实例。
编辑:值得注意的是,self
实例方法的第一个参数的变量名的选择是跨 Python 的任意但一致的选择。
推荐阅读
- java - 如何将 JUnit 类移动到包中?
- swift - xcode 10:如何使用“快速打开(shift+command+O)”打开快速代码?
- swift - 使用 DispatchQueue.main.sync 时应用程序崩溃
- javascript - Update asp.net 中的语法错误需要有人来找出我的句子的问题
- matlab - 在matlab中合并具有不同行的表,但我必须并排放置我的文件
- mysql - 如何优化两个查询相似的联合运算符的使用?
- html - d-flex 删除超链接前的空格
- python - 我想计算抵押贷款的每月还款额
- python - 导入 tensorflow-gpu 版本时出错
- javascript - 使用“?”时滚动到 id 元素 在网址中,vue.js