2010-05-18 55 views
0

我有一個Python腳本,我想在腳本中調用它的幾個函數。下面的實施例的代碼:如何在幾個函數中啓動一個Python腳本

class Name(): 

    def __init__(self): 
     self.name = 'John' 
     self.address = 'Place' 
     self.age = '100' 

    def printName(self): 
     print self.name 

    def printAddress(self): 
     print self.address 

    def printAge(self): 
     print self.age 

if __name__ == '__main__': 
    Person = Name() 
    Person.printName() 
    Person.printAddress() 
    Person.printage() 

我通過輸入./name.py執行該代碼。我怎麼能從腳本末尾的函數printAddress()中減去這段代碼?

感謝

+3

我不太瞭解這個問題。你想遞歸運行腳本? – extraneon 2010-05-18 09:33:53

回答

3

如果你問如何啓動你的python腳本並讓它開始在不同的位置執行,那麼你將不得不啓動腳本wi提供一些關於你想要做什麼的信息。最常見的方法是添加對命令行參數的支持。

import sys 

if __name__ == '__main__': 

    for arg in sys.argv: 
     print arg 

如果你要通過自身在命令行中它不會做任何事情,執行上面的腳本,但如果你有一些額外的參數,如

./launch.py my_argument another_argument and_so_on 

您將看到腳本啓動它可以通過sys.argv列表訪問額外的啓動參數。使用它,您可以檢查啓動時是否傳遞了任何參數,然後在您想要的位置開始執行腳本。用你的腳本

一個例子可以如下

import sys 

class Name: 

    def __init__(self): 
     self.name = 'John' 
     self.address = 'Place' 
     self.age = '100' 

    def printName(self): 
     print self.name 

    def printAddress(self): 
     print self.address 

    def printAge(self): 
     print self.age 


if __name__ == '__main__': 

    Person = Name() 

    launchOptions = sys.argv[1:] 

    if not launchOptions or 'name' in launchOptions: 
     Person.printName() 

    if not launchOptions or 'address' in launchOptions: 
     Person.printAddress() 

    if not launchOptions or 'age' in launchOptions: 
     Person.printAge() 

範圍在sys.argv中[1:]是因爲在sys.argv中的第一項將是路徑啓動腳本。

所以,你可以啓動這個例子,得到下面的結果

./launch 
John 
Place 
100 

./launch age 
100 

./launch address 
Place 

./launch name 
John 

現在,這只是一個非常簡單的例子。如果您決定進一步朝這個方向發展,您可以閱讀pythons getopt module。它是命令行選項的解析器。

希望我能正確理解這個問題。

+0

閱讀其他答案後,我現在不確定實際問題可能是什麼。 – JoeyJoeJoe 2010-05-18 12:29:26

+0

@jamescg - 不,這是完美的。對不起這個令人困惑的問題,但這個答案就是現實。感謝+1 – chrissygormley 2010-05-18 12:49:57

1

我不建議你真正做到這一點,因爲它是一個無盡的遞歸函數這種方式,但它可以做:)

class Name(): 

    def __init__(self): 
     self.name = 'John' 
     self.address = 'Place' 
     self.age = '100' 

    def printName(self): 
     print self.name 

    def printAddress(self): 
     print self.address 
     main() 

    def printAge(self): 
     print self.age 

def main(): 
    Person = Name() 
    Person.printName() 
    Person.printAddress() 
    Person.printage() 

if __name__ == '__main__': 
    main() 
+0

我不明白這裏回答的是什麼。代碼可能組織性更好,但它與問題的關係以及首先問題是什麼? – joaquin 2010-05-18 12:08:05

+0

@Joaquin我讀到這個問題的方式更像:我如何從printAddress中重新啓動main方法。這對我來說沒有多大意義(我對這個問題進行了評論),但是可以回答:) – extraneon 2010-05-18 14:11:14

+0

對,這並不容易。至少有人明白它在最後 – joaquin 2010-05-18 15:15:49

0

Person = Name() 

表示該類的名稱實際上應該是Person。完全刪除printXXX方法,並添加__repr__方法。像

def __repr__(self): 
    return "%s\n%s\n%s" % (self.name, self.address, self.age) 

最後,我建議添加的姓名,地址,年齡由init接受的參數列表:

def __init__(self, name, address, age): 
    ... 

實例化一個Person對象後,你可以打印:

person = Person() 
print person 
+0

用於打印使用__str__而不是__repr__。 __repr__用於序列化(儘管在某些情況下它們可以相同) – Mark 2010-05-18 11:13:00

相關問題