【“笨办法”学Python】42.对象、类及从属关系——类即是对象

【“笨办法”学Python】42.对象、类及从属关系——类即是对象,第1张

【“笨办法”学Python】42.对象、类及从属关系——类即是对象

42.对象、类及从属关系——类即是对象


文章目录

前言一、鱼和泥鳅有什么区别?二、小丽和泥鳅有什么区别?三、代码测试四、super(Employee, self).__init__(name)五、关于 class Name(object)总结


前言

  “类(class)”和“对象(object)”的区别。


一、鱼和泥鳅有什么区别?

  这个问题会让人有点晕,它意思是说,鱼和泥鳅是不一样,不过它们其实也是一样的!泥鳅是鱼的一种,所以说没什么不同,不过泥鳅又有些特别,它和别的种类的鱼的确不一样,比如泥鳅和黄鳝就不一样。所以泥鳅和鱼既相同又不同。
  这个问题让人晕的原因是大部分人不会这样去思考问题,其实每个人都懂这一点,你无须去思考鱼和泥鳅的区别,因为你知道它们之间的关系。你知道泥鳅是鱼的一种,而且鱼还有别的种类,根本就没必要去思考这类问题。
  更进一步的,假设有一只水桶,里边有三条泥鳅。假设你的好人卡多到没地方用,于是你给它们分别取名叫小方,小乔,小丽。现在想想这个问题:


二、小丽和泥鳅有什么区别?

  这个问题一样的奇怪,但比起鱼和泥鳅的问题来还好点。要知道小丽是一条泥鳅,所以它并没什么不同,它只是泥鳅的一个“实例(instance)”。小方和小乔一样也是泥鳅的实例。它们的意思是说,它们是由泥鳅创建出来的,而且代表着和泥鳅一样的属性。
  所以需要这样思考:鱼是一个“类(class)”,泥鳅是一个“类(class)”,而小丽是一个“对象(object)”。
  鱼是一个“类”,表示它不是一个真正的东西,而是一个用来描述具有同类属性的实例的概括性词汇。 有鳍?有鳔?住在水里?那它就是一条鱼。
  后来水产博士路过,看到水桶里的泥鳅:“这是鲤形目鳅科的泥鳅。” 专家一出,真相即现。并且专家还定义了一个新的叫做“泥鳅”的“类”,而这个“类”又有它特定的属性。细长条?有胡须?爱钻泥巴?吃起来味道还可以?那它就是一条泥鳅。
  最后大厨路过,他跟水产博士说:“非也非也,你看到那条泥鳅,我叫它小丽,我要把小丽和剁椒配一起做一道小菜。”于是,就有了一只叫做小丽的泥鳅的“实例(instance)”(泥鳅也是鱼的一个“实例”),并且你使用了它(把它塞到你的胃里了),这样它就是一个“对象(object)”。
  这会你应该了解了:小丽是泥鳅的成员,而泥鳅又是鱼的成员。这里的关系式:对象属于某个类,而某个类又属于另一个类。


三、代码测试

  这个概念有点绕人,不过实话说,只要在创建和使用class的时候 *** 心一下就可以了。
  两个区分Class 和Object 的小技巧:
(1) 首先针对类和对象,需要学会两个说法,“is-a(是什么)”和“has-a(有什么)”。
(2) “是什么”要用在谈论“两者以类的关系互相关联”的时候,而“有什么”要用在“两者无共同点,仅是互为参照”的时候。
  记住,“是什么”指的是鱼和泥鳅的关系,而“有什么”指的是泥鳅和鳃的关系。

# 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
        print ("Dog class init")
        self.name = name
 
# Cat is-a Animal
class Cat(Animal):
 
    def __init__(self, name):
        # Cat has-a name
        print ("Cat class init")
        self.name = name
 
# Person is-a object
class Person(object):
    
    def __init__(self, name):
        # Person has-a name
        print ("Person class init")
        print ("person super")
        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):
        # Employee has-a name
        # 子类调用父类时候使用 super(子类名, self).方法名(参数)
        # 子类 Employee 要调用父类 Person 的 name ,因为这里本来没有 name 这个东西
        print ("Employee class init")
        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 named satan
mary.pet = satan
 
# frank is-a Employee ,frank has-a salary = 120000
frank = Employee("Frank", 120000)
 
# frank has-a pet named rover
frank.pet = rover
 
# 把flipper设为类Fish的一个实例
flipper = Fish()
 
# Salmon三文鱼,把crouse设为Salmon的一个实例
crouse = Salmon()
 
# Halibut大比目鱼,把harry设为Halibut的一个实例
harry = Halibut()

  在Window上键入Python就可以看到结果。

python ex42.py


  从整个计算机科学的角度来说,对象是对客观事物的抽象,类是对对象的抽象,大类是对小类的抽象。类和对象都是一种抽象的数据类型。
  对象(Object):是指在应用问题中出现的各种实体、事件和规格说明等,它是由一组属性和在这组值上的一组服务(这里的服务指的是 *** 作,就是我们写在类里的函数所提供的功能)构成的,其中属性值确定了对象的状态。
  类(Class):把具有相同属性和服务的对象归到同一类,而把一个类中的的每一个对象称为该类的一个实例(Instance),它们具有相同的服务。
  继承:面向对象方法最有特色的方面。
  继承性(Inheritance)是指,在某种情况下,一个类会有“子类”。子类比原本的类(称为父类)要更加具体化、定制化。

四、super(Employee, self).__init__(name)

  ex42.py中的super(Employee, self).__init__(name)其实简单理解就是子类把父类的.__init__()放到自己的.__init__()当中,这样子类就有了父类的.__init__()的那些东西。
  代码中,Employee类继承Person,super(Employee, self).__init__(name)就是对继承自父类Person的属性进行初始化。而且是用Person的初始化方法来初始化继承的属性。
  也就是说,子类继承了父类的所有属性和方法,父类属性自然会用父类方法来进行初始化。
举个例子帮助大家理解:

class Person(object):
    def __init__(self,name,gender,age):
        self.name = name
        self.gender = gender
        self.age = age
        
class Student(Person):
    def __init__(self,name,gender,age,school,score):
        super(Student,self).__init__(name,gender,age)
        self.school = school
        self.score = score

s = Student('Alice','female',18,'Middle school',87)

print(s.name) 
print(s.gender)
print(s.age) 
print(s.school)
print(s.score)

  运行后可以看到结果:

五、关于 class Name(object)

  使用 class Name(object) 真正的原因是在Python早期,它对于class的定义在很多方面都是严重有问题的。当他们承认这一点的时候已经太迟了,所以逼不得已,他们需要支持这种有问题的 class。为了解决已有的问题,他们需要引入一种“新类”,这样的话“旧类”还能继续使用,而你也有一个新的正确的类可以使用了。
  这就用到了“类即是对象”的概念。他们决定用小写的“object”这个词作为一个类,让你在创建新类时从它继承下来。一个类从另一个类继承,而后者虽然是个类,但名字却叫“object”!不过在定义类的时候,别忘记要从object继承就好了。


总结

  以上内容介绍了Python的对象、类及从属关系,有关Python、数据科学、人工智能等文章后续会不定期发布,请大家多多关注,一键三连哟(●’◡’●)。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5701553.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存