首页 > 解决方案 > 一个类只是一个模板,还是它本身也是一个实例?

问题描述

类是封装我的数据和作用于它的方法的完美对象。我只需要一个类实例。因为该类具有低于其级别的全局范围,所以我想将类名用于所有数据管理。

另一种方法是创建一个类实例,然后传递它。另一种选择是将实例设为全局,但随后人们可能会对我大喊大叫。:)

类对象的行为是否与实例完全一样?它是否保留了所有的“自我”。修改后的变量?我需要在每个方法之前添加语句'@staticmethod'吗?

标签: python-3.xclass

解决方案


由于 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

如您所见,如果变量与函数处于同一级别,或者函数具有@staticmethodor@classmethod装饰器之一,则类的行为类似于实例。

编辑:值得注意的是,self实例方法的第一个参数的变量名的选择是跨 Python 的任意但一致的选择。


推荐阅读