【问题标题】:Using OOP to create a list of names使用 OOP 创建名称列表
【发布时间】:2014-01-23 19:51:49
【问题描述】:

我正在经历 LPTHW 并且在前 42 (http://learnpythonthehardway.org/book/ex43.html),我认为我对 is-a 和 has-a 概念有很好的掌握,但在学习练习中,他要求我们添加列表和 dicts到类,以使其成为一个更具功能性的脚本。我正在考虑为狗、猫和人或员工的字典添加一个列表,以便存储名称的值,在员工的情况下还有工资。我不知道如何做到这一点并使其发挥作用,有人可以给我一个简短的例子来说明我正在尝试做的事情,我将从那里构建以完成其余部分。谢谢,下面还有代码...

我所了解的快速示例...

class Animal(object):
    pass

## Dog is-a Animal
class Dog(Animal):
   def __init__(self, name):
        ##Dog has-a name
        self.name = name
        self.doglist = []

Dog.doglist.append("Rover")

当我执行上述操作时,我得到一个错误'AttributeError:类型对象'Dog'没有属性doglist。

完整代码:

##Animal is-a object (yes, sort of confusing) look at the extra credit
class Animal(object):
    pass

## Dog is-a Animal
class Dog(Animal):
    def __init__(self, name):
        ##Dog has-a name
        self.name = name


##Cat is-a animal
class Cat(Animal):
    def __init__(self, name):
        ##Cat has-a name
        self.name = name

##Person is-a object
class Person(object):
    def __init__(self, name):
        ##Person has-a name
        self.name = name


        ##Person has-a pet
        self.pet = None


##Employee is-a Person
class Employee(Person):
    def __init__(self, name, salary):
        ## not sure what this does
        super(Employee, self).__init__(name)
        ##Person has-a salary
        self.salary = salary

##Fish is a class
class Fish(object):
    pass

##Salmon is-a fish and is a class
class Salmon(Fish):
    pass

##Halibut is-a fish
class Halibut(Fish):
    pass

##rover is-a Dog
rover = Dog("Rover")


##satan is-a Cat
satan = Cat("Satan")

##mary is a person
mary = Person("Mary")

##Mary has-a pet named satan
mary.pet = satan

##frank is-a employee that has-a salary of 120,000
frank = Employee("Frank", 120000)

##frank has-a pet rover(dog)
frank.pet = rover

##flipper is-a instance of Fish
flipper = Fish()

##crouse is-a instance of salmon
crouse = Salmon()

##harry is-a instance of Halibut
harry = Halibut()

print frank.pet.name

【问题讨论】:

  • 继承的全部意义在于将功能放在它所属的类中,并在所有子类中使用它。为什么不向Animal 添加一个列表,向Person 添加一个字典?另外,我不确定你想要什么。此代码是否不起作用或行为异常?它有什么没有在做的吗?
  • 不,它工作得很好。我确实想向Animal 添加一个列表,向Person 添加一个字典,但我不知道如何正确格式化它...例如,我是否只需将self.Animallist = [] 放入动物中以创建一个列表那里?以及如何附加到该列表? self.Animallist.append = 'randomname' 因为我想我试过了,但没用...
  • append() 是方法而不是属性。使用它list.append(thing_to_append)。因此,如果您使用self.animal_list =[],它将起作用。如果catCat() 的一个实例@ 是cat.animal_list.append(cat_thing),那么您需要做的就是cat.animal_list.append(cat_thing)
  • 谢谢伊恩,我会试一试...啊,所以也许添加self.Animallist = [],然后使用self.Animallist.append('randomname")?我会试试这个
  • 我试过了,但我在这里发现了一些语法错误...请参阅上面我不断收到的错误以及我在原始帖子中放置的示例...我在这里遗漏了一些东西,我我相信它很简单

标签: python list class oop dictionary


【解决方案1】:
class Animal(object):
    pass

## Dog is-a Animal
class Dog(Animal):
   def __init__(self, name):
        ##Dog has-a name
        self.name = name
        self.doglist = []

Dog.doglist.append("Rover")

这不起作用的原因是因为您还没有初始化Dog 对象。要更正此问题:

dog = Dog('Fido')
dog.doglist.append('Rover')

当您在__init__ 方法中设置一个属性时,您必须先初始化它才能访问该属性,否则它不存在。如果您想让所有 Dog 对象共享同一个列表,您可以:

class Dog:
    dog_list = []

    def __init__(self, name):
        self.name = name

然后

>>> Dog.dog_list.append('Fido')
>>> Dog.dog_list
['Fido']
>>> dog = Dog('Rover')
>>> dog.dog_list
['Fido']
>>> dog.dog_list.append('Rover')
>>> dog.dog_list
['Fido', 'Rover']
>>> Dog.dog_list
['Fido', 'Rover']

在方法之外声明的属性将在该类的所有实例之间共享。

【讨论】:

  • 这正是我正在寻找的解释类型!我会投票,但我没有声誉哈。非常感谢,我真的很感激,这真的帮助我掌握了这个概念。
  • 我添加评论只是为了再次感谢您,您帮助了我很多,非常感谢。
猜你喜欢
  • 2022-08-14
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多