所以我在我的职业生涯中一直在努力用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)
我真的想了解这一点。我的意思是我工作得很好(这是一个代码示例,而不是我的实际项目),但如果我理解为什么它正在工作,它会有所帮助。谢谢,我确定这可能是一个简单的问题。
答案 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.function1
和index.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中使用该对象
答案 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)
无法正常工作。试试吧,看看