0

我对 python 和 OOP 真的很陌生,只是想掌握一些事情的窍门。但这我不是很了解。我有这个简单的类,但是当我运行它时,我得到'Person' object has no attribute 'first'。所以我在这里读到这是因为 ._ (私有变量)。我可以以某种方式访问​​它们吗?如果我然后删除 ._ 并拥有公共类(我猜),我会得到这个'str' object is not callable。因此,如果我理解正确,我正在用字符串覆盖一个函数,这是在我声明 p1 和 p2 的地方发生的吗?我怎样才能解决这个问题?

class Person:
   def __init__(self, **kwargs):
      self._first = kwargs['first']
      self._last = kwargs['last']
      self._age = kwargs['age']

      def first(self):
          return self._first

      def last(self):
          return self._last

      def age(self):
          return self._age

def printPerson(o):
   print('The persons name is {0} {1} and the age is 
   {2}.'.format(o.first(), o.last(), o.age()))

def main():
    p1 = Person(first='John', last='Stevenson', age=35)
    p2 = Person(first='Ash', last='Bradley', age=35)
    printPerson(p1)
    printPerson(p2)

if __name__ == '__main__': main()
4

1 回答 1

1

你可以做这样的事情吗?

class Person:
    def __init__(self, dictionary):
        self._first = dictionary['first']
        self._last = dictionary['last']
        self._age = dictionary['age']

    def first(self):
        return self._first

    def last(self):
        return self._last

    def age(self):
        return self._age

def printPerson(o):
   print('The persons name is {0} {1} and the age is {2}.'.format(o.first(), o.last(), o.age()))

def main():
    p1 = Person({'first': 'John', 'last': 'Stevenson', 'age': 35})
    p2 = Person({'first': 'Ash', 'last': 'Bradley', 'age': 35})
    printPerson(p1)
    printPerson(p2)

if __name__ == '__main__': main()

这首先解决了您在班级的 first、last 和 age 方法中遇到的缩进问题。这可能不是您正在寻找的确切解决方案,但我实现了一个字典,该字典在创建它的新实例时传递给类,以便使用键['first']['last']和保持相同的代码样式['age']。此外,您实际上并不需要类中的 first、last 或 age 方法……例如:

class Person:
    def __init__(self, dictionary):
        self._first = dictionary['first']
        self._last = dictionary['last']
        self._age = dictionary['age']

    def printPerson(self):
        print('The persons name is {0} {1} and the age is {2}.'.format(self._first, self._last, self._age))

def main():
    p1 = Person({'first': 'John', 'last': 'Stevenson', 'age': 35})
    p2 = Person({'first': 'Ash', 'last': 'Bradley', 'age': 35})
    p1.printPerson()
    p2.printPerson()

if __name__ == '__main__':
    main()

也可以,而且我认为您要完成的工作要清楚得多。您还可以将类所需的参数定义为它的一部分,并使用默认值以防万一

class Person:
    def __init__(self, first, last='Doe', age=10):
        self._first = first
        self._last = last
        self._age = age

    def printPerson(self):
        print('The persons name is {0} {1} and the age is {2}.'.format(self._first, self._last, self._age))

def main():
    p1 = Person('John', 'Stevenson', 35)
    p2 = Person('Ash', last='Bradley', age=35)
    p1.printPerson()
    p2.printPerson()

if __name__ == '__main__':
    main()

使用此方法,您可以看到姓氏默认为“Doe”,年龄默认为 10。如图所示,您可以从语法中指定这些参数,last='Bradley'或者只是省略last=初始化实例时赋予类的顺序

于 2019-01-24T18:44:59.080 回答