为什么我需要将对象传递给此 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.function1
和 index.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)
不起作用。试试看
所以在我的职业生涯中,我一直在努力用 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.function1
和 index.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)
不起作用。试试看