为什么我需要将对象传递给此 class 才能使其工作?

Why do I need to pass an object to this class to make it work?

所以在我的职业生涯中,我一直在努力用 Python 替换 PHP。所以我在 apache 中将 WebPy 与 WSGI 一起使用,并且一切正常,但我仍在学习这门语言,并且找不到对此的简单解释。因此,在四处乱逛,试图让其他 classes 方法在其他 classes 中工作时,我遇到了一些说明,这些说明显示第一个 class 被实例化并附加了 (object) class 名称。事实证明这可行,让我将数据传递给另一个 class。谁能告诉我为什么这段代码会起作用?

我的意思是,在我看来,如果第一个 class 在其定义期间未指定(对象),则无法将数据传递到 class ?这样对吗?

class MyClass(object):
    def function1(self, num1, num2):
        return num1 + num2

class index:
    def GET(self):
        form = web.input()
        num1 = form.number1
        num2 = form.number2

        MyClass.function1(num1, num2)

我真的很想了解这一点。我的意思是我让它工作真是太好了(这是一个代码示例,而不是我的实际项目),但如果我理解它为什么工作,它会有所帮助。谢谢,我确定这可能是一个简单的问题。

不要对此感到困惑。它是新样式对象,在 python 2.2 中引入了几个新功能。它是 Python 3 中的默认行为。但您需要在 Python 2

中拥有该对象

请参考:Python class inherits object

Python2中有两种class类型:老式和新式。新样式 classes 是通过子classing object 创建的。区别不是那么大,事实上你几乎不会注意到它,如果你不使用多重继承和类型比较type,即

class old_style:
    def __init__(self):
       pass

class new_style(object):
    def __init__(self):
        pass

old_style_instance1 = old_style()
old_style_instance2 = old_style()
new_style_instance1 = new_style()
new_style_instance2 = new_style()

type(old_style_instance1) == type(old_style_instance2)

Returns False

type(new_style_instance1) == type(new_style_instance2)

Returns True

关于您的代码。您倾向于使用实例方法,如果它们是 class 方法,即方法 MyClass.function1index.GET 有一个名为 self 的参数,因此它们只能从 class 实例,而不是 classes 本身。 self 是在实例初始化时通过特殊方法(__new__)创建的特殊命名空间,例如myclass_instance = MyClass()。如果您想使用 class 方法或可以从 classes 调用的静态方法,您应该以不同的方式声明它们。

class MyClass(object):
    @staticmethod
    def function1(num1, num2):
        return num1 + num2

class index:
    @staticmethod
    def GET():
        num1, num2 = get_numbers_somehow()
        MyClass.function1(num1, num2)

在这种情况下,代码将起作用,这与从 object class 继承的 MyClass 无关。您应该考虑阅读 Python classes 和实例以了解差异。顺便说一句, @ 语法用于一种叫做装饰的东西。如果你打算经常使用它,请阅读 Python 装饰器。

我想这段自省会帮助你理解:

给定任何对象 x,您可以通过键入 dir(x) 查看可用的函数和数据成员。试试这个东西:

>>> object
<type 'object'>      
>>> dir(object)
['__class__', '__delattr__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__']
>>> 
>>> 
>>> class A:pass
...              
>>> A
<class __main__.A at 0x7f2ef1bdf2c0>
>>> 
>>> dir(A)
['__doc__', '__module__']    #this is the only stuff attached to the class 'A'
>>> 
>>> class B(object):pass   #the brackets imply inheritance
... 
>>> B
<class '__main__.B'>
>>> 
>>> dir(B)
['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

B 拥有 A 拥有的所有东西(因为有一些默认的东西都 类 得到),并且还拥有 object 拥有的所有东西(因为它 继承 来自 object)

还有。在您的代码中,行 MyClass.function1(num1, num2) 不起作用。试试看