笨方法学Python—ex42:对象、类及从属关系

本文通过具体例子解释了面向对象编程中的类与对象概念,以及它们之间的关系。通过鱼与泥鳅的比喻,清晰地阐述了类与对象的概念,并介绍了Python中的类定义方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对象、类及从属关系
“类”(class)和“对象”(object)的区别:
两者并没有真正的不同,只是在不同时间名字不同罢了。
1) 鱼和泥鳅有什么区别呢?
两者之间不同,但也有相同点:泥鳅是鱼的一种,但是又区别于其他鱼。
2)三条泥鳅:小方、小乔、小丽。小丽和泥鳅有啥区别?
并没有不同,只是泥鳅的一个“实例”(instance)。小乔、小方也一样。
“实例”? 它们都是从泥鳅中创建出来,且具有泥鳅属性的具体、真实的东西。

总结: 鱼是一个“类”,泥鳅是一个“类”,小丽是一个“对象”。
         小丽是泥鳅的成员,泥鳅又是鱼的成员——对象属于某类,而某类又属于另一个类。
代码写成什么样子?
针对类和对象,你只需学会两个说法,“is-a”(是什么)和“has-a”(有什么)。
“是什么”用在谈论“两者以类的关系互相联系”的时候,“有什么”用在“两者无共同点,仅是互相参照”的时候。
“是什么”指鱼和泥鳅的关系,而“有什么”指泥鳅和鳃的关系。
## 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 of some kind
        self.pet = None

## ??(Employee is-a Person)
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 Fish)
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(cat) and name is satan)

## ??(frank is-a Employee)
frank = Employee("Frank", 12000)

## ??(frank has-a pet(dog) and name is rover
frank.pet = rover

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

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

## ??(harry is-a Halibut)
harry = Halibut()
关于class Name(object)
就假设Python要求你在制造类的时候总要加上(object)
附加练习
1. 研究一下为什么Python添加了这个奇怪的叫做object的类,它究竟有什么含义?
2. 有没有办法把类当做object使用呢?
3. 习题中为animals、fish和people添加一些函数,让它们做一些事情。看看函数在Animal这样的“基类”(base class)里和在Dog里有什么区别。
4. 找别人的代码,理清里边的“是什么”和“有什么”的关系。
5. 使用列表和字典创建一些新的一对多的“有多个”(has-many)的关系。
6. 你认为会有一种“有多个”关系吗?阅读关于“多重继承”(multiple inheritance)的资料,然后尽量避免此类用法。
常见问题回答
self.pet = None 有什么用?
确保类的self.pet属性被设置为None。

super(Employee, self).__init__(name)是做什么用的?
这样你可以可靠的将父类的__init__方法运行起来。搜索Python super ,看看其优缺点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值