Python:是执行的入口点(__main__)?

时间:2014-01-27 18:11:17

标签: python class object

我编写了以下python代码,并尝试使用__main__初始化两个类对象,但在运行python classPerson.py时出现以下错误。我想知道在python中初始化类对象的正确方法是什么。

Person(object):
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary


    def getName():
        return self.name

    def getSalary():
        return self.salary

    if __name__ == '__main__':
        bob = Person('Bob Smith', 40000)

        sue = Person('Sue Funk', 35000)

        print 'bob makes a salary of %d' % (bob.getSalary)
        print 'sue's full name is %s' % (sue.getName)

错误:

Traceback (most recent call last):
  File "classTest1.py", line 1, in <module>
    class Person(object):
  File "classTest1.py", line 14, in Person
    bob = Person('Bob Smith', 40000)
NameError: name 'Person' is not defined

3 个答案:

答案 0 :(得分:4)

您需要 unindent if __name__阻止 成为Person类的一部分。

它执行得太早,当时仍在构建Person类。

通过将其缩进到与Person类主体中的方法相同的级别,您可以使用类定义的测试部分。它正在执行时仍然定义类,因此Person类引用尚不存在。

更正后的代码:

class Person(object):
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary

    def getName(self):
        return self.name

    def getSalary(self):
        return self.salary

if __name__ == '__main__':
    bob = Person('Bob Smith', 40000)

    sue = Person('Sue Funk', 35000)

    print 'bob makes a salary of %d' % (bob.getSalary())
    print "sue's full name is %s" % (sue.getName())

注意:

  1. 您还需要调用 getSalary()getName()方法。
  2. 为所有方法提供self参数。
  3. 对字符串使用正确的引用(sue's包含单引号,最好使用双引号来分隔该字符串。)

答案 1 :(得分:4)

在定义时,你不能使用Person类,你必须将它缩小一个缩进级别

class Person(object):
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary


    def getName(self):
        return self.name

    def getSalary(self):
        return self.salary

if __name__ == '__main__':
    bob = Person('Bob Smith', 40000)

    sue = Person('Sue Funk', 35000)

    print 'bob makes a salary of %d' % (bob.getSalary())
    print "sue's full name is %s" % (sue.getName())

编辑根据Sukrit Kalra评论更正了最后一条声明

编辑调用方法的正确方法是使用括号,并且正确的方法来定义它是在参数中使用self 但是使用该类的惯用方法是不要使用getter和setter

class Person(object):
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary


if __name__ == '__main__':
    bob = Person('Bob Smith', 40000)

    sue = Person('Sue Funk', 35000)

    print 'bob makes a salary of %d' % (bob.salary)
    print "sue's full name is %s" % (sue.name)

python is not java!

答案 2 :(得分:2)

您将if __name__ == "__main__"块缩进了一个级别太远了。尝试运行

class Person(object):
    def __init__(self, name, salary):
        self.name = name
        self.salary = salary


    def getName(self):
        return self.name

    def getSalary(self):
        return self.salary

if __name__ == '__main__':
    bob = Person('Bob Smith', 40000)
    sue = Person('Sue Funk', 35000)
    print 'bob makes a salary of %d' % (bob.getSalary())
    print "sue's full name is %s" % (sue.getName())

因为在你的代码中,if块在Person类中,并且在构建类之前你正在创建该类的对象,所以它会给你一个错误。