2017-04-19 53 views
-1

我喜欢制作真正的模块化程序,但很难追踪哪些功能是其他功能的子程序。因此,我想定义父函数内的子例程。用Python的函数对象定义,这将是一个有力的实现:如何制作模块化功能?

>>> def football(): 
...  self = football 
... 
...  logo = "Nike" 
... 
...  self.display_logo(self) 
... 
>>> def display_logo(self): 
...  print(self.logo) 

>>> football.display_logo = display_logo 

>>> football() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<stdin>", line 6, in football 
    File "<stdin>", line 2, in display_logo 
AttributeError: 'function' object has no attribute 'logo' 

不幸的是,这是行不通的。它也不是通过尝试自己访问“标识”来工作的。我可以用自己定义函数中的每个变量。前缀,但是有没有更实用的方法来创建可以在调用时访问父函数内部变量的子例程?

+6

你应该考虑做一个类,而不是试图用普通函数做这个。 – BrenBarn

回答

0

这个错误是因为自我,该参数display_logo,是不是你认为你有属性的对象。如果您尝试逐行浏览代码,则会发现各种问题。最大的问题是你使用变量,就好像你有一个类定义了一个对象,但你从来没有定义过一个类。大多数情况下,您使用的名称只是简单的名称,没有特殊的含义。只要你尝试以特殊的方式使用它们,Python就会给你一个错误信息。

你需要按照一个简单的教程制作课程。你想要看起来更像这样:

class Football(): 
    def __init__(self): 
     self.logo = "Nike" 
     self.display_logo() 

    def display_logo(self): 
     print(self.logo) 

Football() 

这有帮助吗?

+1

错误与您所写的内容无关。 OP在'self.logo ='Nike''中简单地错过了'self'。其余的是正确的,尽管是非常糟糕的面向对象。他们正在使用函数对象作为对象... – JBernardo

+0

我追求设计的错误。是的,你可以通过这个简单的改变来创建语法*合法*,但是功能远不是OP所期望的。 – Prune

+0

其实它不是。尝试执行我上面写的更改并运行他的代码 – JBernardo

0

尝试使用一些实际的OOP

class Football: 
    def __init__(self): 
     self.logo = 'Nike' 
     self.display_logo() 

    def display_logo(self): 
     print(self.logo) 

football = Football()