学习Python艰难的第二版。练习45

时间:2011-08-08 01:24:34

标签: python

我正在学习艰难的第二版学习Python,我刚刚完成了练习,我想写下is-a / has-a的关系。能够以某种方式使用类,但我发现是-a / has-a confusing。所以我不知道如果我所做的是正确的,任何指针都会受到赞赏。感谢。

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


## ?? Dog is-a object
class Dog(Animal):

    def __init__(self, name):
        ## ?? Dog has-a name
        self.name = name

## ?? Cat is-a object
class Cat(Animal):

    def __init__(self, name):
        ## ?? Cat has-a name
        self.name = name

class Person(object):

    def __init__(self, name):
        ## ?? Person has-a name
        self.name = name

        ## Person has-a pet of some kind
        self.pet = None

## ?? Employee is-a object
class Employee(Person):

    def __init__(self, name, salary):
        ## ?? hmm  what is this strange magic? 
        super(Employee, self).__init__(name)
        ## ?? Employee has-a salary
        self.salary = salary

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

## ?? Salmon is-a object, type of a fish
class Salmon(Fish):
    pass

## ?? Halibut is-a object, type of 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 called satan
mary.pet = satan

## ?? frank is-a Employee on 120000 salary
frank = Employee("Frank", 120000)

## ?? frank has-a pet called rover
frank.pet = rover

## ?? flipper is Fish
flipper = Fish()

## ?? crouse is-a Salmon
crouse = Salmon()

## ?? harry is-a Halibut
harry = Halibut()

4 个答案:

答案 0 :(得分:4)

所以你很亲密。我记得最初也在与OOP范式挣扎,尤其是在学习了一些c之后。无论如何,OOP真的比它看起来更常见......这里唯一棘手的一点就是第一个给你的东西......动物是一个对象。

虽然你是对的,狗,猫和雇员是对象,但他们更重要的是动物,动物和人。

这个练习实际上是关于OOP的属性,继承。例如,Dog的类层次结构:

对象 - >动物 - >狗

狗既是动物又是对象,它具有两者的所有属性。现在可以在子类中重写属性,但这可以在以后讨论。

我认为你开始围绕大比目鱼和鲑鱼部分。它们都是物体和鱼。

我要说的最后一点是:

Frank是一名员工(和人和物),名字是Frank,薪水为120000。

我希望有所帮助。

答案 1 :(得分:2)

学习Python艰难之路'一书已经改变了一些章节,所以虽然这曾经是练习45,现在是练习42.这一章是关于-a并且有一种关系让我感到困惑好的。

从我understood这个问题被认为是Stack Overflow上的offtopic。然而,当我在谷歌搜索帮助时,这是我找到任何答案的第一个地方之一,所以我只想添加我对这个问题的答案。我不完全确定你是否应该回答'糟糕'的问题,但我很确定我不是唯一一个在这项练习中挣扎的人;)。

我的回答:

## Animal is-a object
class Animal(object):
    pass

## Dog is-a Animal (Animal is-a Object, so Dog is-a Object as well.)
class Dog(Animal):

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

## Cat is-a Animal (Animal is-a Object, so Cat is-a Object as well.)
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 of some kind
        self.pet = None

## Employee is-a Person (and is-a Object, of course, everything is-a Object!)
class Employee(Person):

    def __init__(self, name, salary):
        ## ?? This is a reliable way to call the 
        ##     __init__ method from Employee's 'super Class' 
        ##      Person (including name and pet)

        super(Employee, self).__init__(name)

        ## Employee has-a salary
        self.salary = salary

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

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

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


## rover is-a Dog (with name 'Rover')
rover = Dog("Rover")

## satan is-a Cat (with name 'Satan')
satan = Cat("Satan")

## mary is-a Person (with name 'Mary')
mary = Person("Mary")

## mary has-a pet called satan.
mary.pet = satan

## frank is-a Employee with name "Frank" and salary 120000.
## Note: Because Employee is-a Person, frank falls under the 
## Person class too.
frank = Employee("Frank", 120000)

## frank (the Employee from above) has a pet named rover. Since 
## frank is-a Employee, which falls under (is-a) Person, this means 
## he has-a pet as well.
frank.pet = rover

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

## course is-a Salmon
crouse = Salmon()

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

答案 2 :(得分:1)

在大多数情况下,你所拥有的是正确的。您建立了一个基类(即Fish),并通过继承它并添加质量或更多功能来扩展或进一步定义具有更多详细信息的基类。这是你的“is-a”关系。

您的员工“是一个”人,也是“有一个”薪水。工资可以是一个人可能拥有或可能没有的单独定义的对象。您甚至可以移动它,以便其他对象包含或拥有相同的对象,Salary:

class AnimalActor(Dog):
   def __init__(self, salary):
      self.__salary = salary

s = Salary(50000)
lassie = AnimalActor(s)

“lassie”“is-a”Dog and also“has-a”Salary。

答案 3 :(得分:1)

我觉得你可能已经离开了一些。 “Is-a”关系在继承树中一直向下级联,我们将这些称为“全名”。虽然“has-a”关系一直沿着posessions树级联,但我们称之为“meronyms”。

你应该记得在树木上下移动,但我认为你已经有了这个想法。

# Salmon is-a Fish
# Note also that Fish is-a object
class Salmon(Fish):
    pass

# rover is-a Dog
# Dog is-a Animal
# Animal is-a object
# Note also that rover has-a name "Rover"
rover = Dog("Rover")

# frank is-a Employee
# Employee is-a Person
# Person is-a object
# Note also that frank has-a name "Frank"
# and frank has-a salary 120000 (ballllin'! must be a CS major.)
frank = Employee("Frank", 120000)

还有一些你错过了,试着回去画出继承树:

object -> Animal -> Dog -> rover('Rover')
                        -> lassie('Lassie')
        ...
        ...
                 -> Cat -> satan('Lucifer')
       -> Person -> mary("Mary", pet=satan)
        ...

等等。