Python 为什么我需要向这个类传递一个对象才能使它工作?
因此,在我的职业生涯中,我一直在努力用Python取代PHP。所以我在apache中使用WebPy和WSGI,一切都很好,但我仍在学习该语言,找不到简单的解释。所以,当我胡闹,试图让其他类的方法在其他类中工作时,我遇到了一些说明,显示了第一个类被实例化,并在类名后面附加了(object)。事实证明,这是可行的,并允许我将数据传递给另一个类。有人能告诉我为什么这个代码会起作用吗 说到功,我的意思是,在我看来,如果第一个类在定义时没有指定(对象),那么数据就不能传递到那个类中?是这样吗Python 为什么我需要向这个类传递一个对象才能使它工作?,python,class,object,self,Python,Class,Object,Self,因此,在我的职业生涯中,我一直在努力用Python取代PHP。所以我在apache中使用WebPy和WSGI,一切都很好,但我仍在学习该语言,找不到简单的解释。所以,当我胡闹,试图让其他类的方法在其他类中工作时,我遇到了一些说明,显示了第一个类被实例化,并在类名后面附加了(object)。事实证明,这是可行的,并允许我将数据传递给另一个类。有人能告诉我为什么这个代码会起作用吗 说到功,我的意思是,在我看来,如果第一个类在定义时没有指定(对象),那么数据就不能传递到那个类中?是这样吗 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)
我真的很想理解这一点。我的意思是,我让它工作很好(这是一个代码示例,不是我的实际项目),但如果我理解它工作的原因,它会有所帮助。谢谢,我相信这可能是一个简单的问题。不要对此感到困惑。它是一个新的样式对象,在Python2.2中引入了几个新特性。它是Python 3中的默认行为。但是您需要在Python2中拥有该对象
请参阅:不要与此混淆。它是一个新的样式对象,在Python2.2中引入了几个新特性。它是Python 3中的默认行为。但是您需要在Python2中拥有该对象
请参阅:Python 2中有两种类型的类:旧样式和新样式。新样式类是通过子类化
对象创建的。事实上,如果不使用多重继承和与类型
进行类型比较,那么差异并没有那么大,您几乎不会注意到
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
是在实例初始化时由特殊方法(\uuuu new\uuuu
)创建的特殊名称空间,例如myclass\u 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)
在这种情况下,代码将起作用,这与从对象继承类无关。您应该考虑阅读Python类和实例来理解差异。顺便说一句,@
语法用于一种叫做装饰的东西。如果您打算大量使用Python装饰器,请阅读它 Python 2中有两种类型的类:旧样式和新样式。新样式类是通过子类化对象创建的。事实上,如果不使用多重继承和与类型
进行类型比较,那么差异并没有那么大,您几乎不会注意到
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
是在实例初始化时由特殊方法(\uuuu new\uuuu
)创建的特殊名称空间,例如myclass\u 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)
在这种情况下,代码将起作用,这与从对象继承类无关。您应该考虑阅读Python类和实例来理解差异。顺便说一句,@
语法用于一种叫做装饰的东西。如果您打算大量使用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__']
>>对象
>>>目录(对象)
“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU类类类类类类类类类类类类类类类类类类类类类类类类类类类类类,”,”,”,”,”UUUUUUUu_']
>>>
>>>
>>>甲级:及格
...
>>>A
>>>
>>>处长(A)
这是唯一附加到类“A”的东西
>>>
>>>B类(对象):传递#括号表示继承
...
>>>B
>>>
>>>处长(B)
“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU u'、uuu str_uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
B
拥有A
拥有的所有东西(因为所有类都会得到一些默认的东西),也拥有对象拥有的所有东西(因为它从对象继承)
还有。在代码中,MyClass.function1(num1,num2)
行不起作用。试试看我想这一点反省会帮助你理解:
给定任何对象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__']
>>对象
>>>目录(对象)
“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU,“UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU类类类类类类类类类类类类类类类类类类类类类类类类类类类类类,”,”,”,”,”UUUUUUUu_']
>>>
>>>
>>>甲级:及格
...
>>>A
>>>
>>>处长(A)
文件__