为什么我需要将一个对象传递给这个类才能使它工作?

时间:2015-05-11 12:16:02

标签: python class object self

所以我在我的职业生涯中一直在努力用Python取代PHP。所以我在apache中使用WebPy和WSGI,一切都运行良好,但我还在学习这门语言,并且无法找到一个简单的解释。因此,在试图让其他类方法在其他类中工作时,我遇到了一些指令,这些指令显示第一个类被实例化(对象)附加到类名。事实证明这是有效的,并允许我将数据传递到另一个类。有人能告诉我为什么这段代码会起作用吗?

通过工作,我的意思是,在我看来,如果第一个类在定义期间没有指定(对象),那么数据是否无法传递到该类?这是对的吗?

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)

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

3 个答案:

答案 0 :(得分:3)

Python 2中有两种类型:旧样式和新样式。新样式类是通过继承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)

返回False

type(new_style_instance1) == type(new_style_instance2)

返回True

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

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)

在这种情况下,代码将起作用,这与继承自MyClass类的object无关。您应该考虑阅读Python类和实例以了解其中的差异。顺便说一下,@语法用于称为装饰的东西。如果您要使用它,请阅读Python装饰器。

答案 1 :(得分:1)

不要与此混淆。它的新风格对象在python 2.2中引入了几个新功能。它是Python 3中的默认行为,但您需要在Python 2中使用该对象

请参阅:Python class inherits object

答案 2 :(得分:1)

我认为这一点内省会帮助你理解:

给定任何对象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所有的东西(因为它继承了< / strong>来自object

也。在您的代码中,行MyClass.function1(num1, num2)无法正常工作。试试吧,看看