艰苦学习Python第二版。练习45

艰苦学习Python第二版。练习45,python,Python,我正在学习Python the Hard Way第二版,我刚刚做了一个练习,我想写下is-a/has-a关系。我能够以某种方式使用类,但我发现is-a/has-a令人困惑。所以我不知道我所做的是否正确,任何指点都将受到赞赏。谢谢 ## Animal is-a object (yes, sort of confusing) look at the extra credit class Animal(object): pass ## ?? Dog is-a object class Do

我正在学习Python the Hard Way第二版,我刚刚做了一个练习,我想写下is-a/has-a关系。我能够以某种方式使用类,但我发现is-a/has-a令人困惑。所以我不知道我所做的是否正确,任何指点都将受到赞赏。谢谢

## 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()

在大多数情况下,你所拥有的是正确的。您建立了一个基类ie,Fish,并通过继承它并添加质量或更多特性来扩展或进一步定义具有更多细节的基类。这就是你们的“是非”关系

你的雇员是一个人,也有薪水。工资可以是一个单独定义的对象,一个人可能有,也可能没有。您甚至可以将其四处移动,以便其他对象包含或具有相同的对象,即:

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

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

拉西是一只狗,也有一份薪水。

所以你们很接近。我记得一开始我也在为OOP范式而挣扎,特别是在学习了一些c语言之后。不管怎么说,OOP实际上比看起来更符合常识。。。这里唯一棘手的是第一个,它是给你的。。。动物是物体

虽然狗、猫和员工都是物体,但更重要的是它们分别是动物、动物和人

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

对象->动物->狗

狗既是动物又是物体,它“拥有”这两者的所有属性。现在可以在子类中重写属性,但这将在后面讨论

我想你开始在大比目鱼和鲑鱼区了解这些。它们既是物体又是鱼

最后我想说的是:

Frank是一名员工,其姓名为Frank,工资为120000美元


我希望这有帮助。

我觉得你可能遗漏了一些。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)
        ...

诸如此类。

这本《艰苦学习Python》一书将章节稍作改动,因此,虽然这本书过去是练习45,但现在是练习42。关于is-a和has-a关系的这一章也让我困惑了好一阵子

据我所知,这个问题被认为与堆栈溢出无关。然而,当我在谷歌上寻求帮助时,这是我找到答案的第一个地方,所以我只想把我的答案添加到这个问题上。我不完全确定你是否应该回答“糟糕”的问题,但我非常确定,我不是唯一一个在这个练习中苦苦挣扎的人

我的答案是:

## 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()

那么你有什么问题呢?我发布的是我对练习45的解决方案,我不知道我是否走上了正确的道路。所以问题是,我是否可以在我当前的方向上获得指针,类基类和子类之间是否存在is-a关系,类和它的属性/方法之间是否存在has-a关系?太简单了?完全错了?我是否认为python中用于类定义的“object”关键字不是OOP中的“object”,而是类的名称?这本书提到了这种“新式”的阶级观念。我觉得有点头晕;另一件事,在您的示例代码中,“s”是一个对象,对吗?谢谢。在Python中,所有可以绑定到名称的东西都是对象。甚至类也是对象。狗是对象的孙子,动物的孩子?我记得一开始我还在为OOP范式而挣扎。。。哦,我多么渴望有一天能说这句话。谢谢你。我看到隧道尽头有闪光;我必须一劳永逸地解决这个问题。谢谢一方面,这看起来很明显。但后来我遇到了另一件事,让一切都偏离了轨道。在…上当兵。。。