2013-05-25 114 views
-3
#C:/Python32 

class Person: 
    def __init__(self, name = "joe" , age= 20 , salary=0): 
     self.name = name 
     self.age = age 
     self.salary = salary 
    def __printData__(self): 
      return " My name is {0}, my age is {1} , and my salary is {2}.".format(self.name, self.age, self.salary) 
    print(Person) 

class Employee(Person): 
    def __init__(self, name, age , salary): 
     Person. __init__ (self,name = "Mohamed" , age = 20 , salary = 100000) 
     def __printData__(self): 
      return " My name is {0}, my age is {1} , and my salary is {2}.".format(self.name, self.age, self.salary) 
    print(Employee) 


p= Person() 
e = Employee() 
+0

爲什麼你有Python32 shebang和python-2.7標籤? – geoffspear

回答

5

你的問題可以簡化爲:

class Person: 
     print(Person) 

這將引發NameError。構建類時,類的主體將被執行並放置在特殊的命名空間中。該名稱空間然後傳遞給type,它負責實際創建類。

在你的代碼,你想print(Person)Person實際上已創建的類(在其中正在執行類的主體階段 - 它被傳遞給type之前並綁定到類名)之前這導致了NameError

+0

mgilson是正確的,爲了進一步您可以用打印(locals())來替換您的打印,它會告訴您什麼是在執行類體時定義的。 – deufeufeu

+0

@deufeufeu - 你也需要'print(globals())'我相信。 – mgilson

+0

是的,我認爲在這種情況下,我們可以排除globals()給出關於類本身的信息。 – deufeufeu

0

看起來您希望在您的類上調用print時返回某些信息,並且您還希望在創建該類的實例時打印該信息。你要這樣做的方式是爲你的班級定義一個__repr__(或__str__,詳情請參閱Difference between __str__ and __repr__ in Python)。然後,每次打印都會在您班級的一個實例上調用,它將打印該方法返回的內容。然後你可以添加一行到你的__init__方法,打印實例。在該類中,當前實例由特殊的self關鍵字引用,該類的名稱僅在該類的範圍之外定義在主名稱空間中。所以你應該撥打print(self)而不是print(Person)。這裏是你的例子的一些代碼:

class Person: 
    def __init__(self, name = "joe" , age= 20 , salary=0): 
     self.name = name 
     self.age = age 
     self.salary = salary 
     print(self) 
    def __repr__(self): 
     return " My name is {0}, my age is {1} , and my salary is {2}.".format(self.name, self.age, self.salary) 

joe = Person() 
>>> My name is joe, my age is 20 , and my salary is 0.