zoukankan      html  css  js  c++  java
  • python-类与类之间的关系

    类的关系

    • 依赖关系,关联关系,组合关系,继承关系

    • 两个类之间的简单交互,只需要把另一个类的对象传递进去,调用其方法or属性

      # 我们先来写一个人狗大战,人打狗,狗咬人
      
      class Dog(object):
      
          def __init__(self, name, age, xueliang, gongjili):
              # 初始化方法,狗有自己的姓名,年龄,血量,狗的伤害值
              self.dog_name = name
              self.dog_age = age
              self.dog_xueliang = xueliang
              self.dog_gongjili = gongjili
      
          def bite_people(self, people):
              # 这里狗要咬一个人,需要传入一个人的对象,知道咬的人是谁
              people_surplus_xueliang = people.people_xueliang - self.dog_gongjili
              print("这只[{}]狗咬了人[{}]{}血,还剩下{}血".format(self.dog_name, people.people_name, self.dog_gongjili,
                                                      people_surplus_xueliang))
      
      
      class People1(object):
      
          def __init__(self, name, age, xueliang, gongjili):
              # 初始化方法,人有自己的姓名,年龄,血量,人的攻击力
              self.people_name = name
              self.people_age = age
              self.people_xueliang = xueliang
              self.people_gongjili = gongjili
      
          def beat_dog(self, dog):
              # 这里人咬打狗,需要传入一个狗的对象,知道是谁打了那只狗
              dog_suplus_xueliang = dog.dog_xueliang - self.people_gongjili
              print("这个人[{}]打了这只[{}]{}血,还剩下{}血".format(self.people_name, dog.dog_name, self.people_gongjili,
                                                       dog_suplus_xueliang))
      
      
      d = Dog("小黑", 18, 100, 50)  # 创建一个狗的对象
      p = People1('山山', 24, 100, 70)  #创建一个人的对象
      
      d.bite_people(p) # 狗的方法中传入人的对象,调用人的方法or私有属性,这样两个对象就有了简单的交互
      p.beat_dog(d)
      
    • 依赖关系

      # 依赖关系是所有关系中紧密型最低,你中有我,但我中没有你
      
      class Dog(object):
      
          def __init__(self,name,age):
              self.name = name
              self.age = age
      
          def zhuren(self,p_obj):
              print("hi,大家好,我是{},今年{}岁,我的主人是{}".format(self.name,self.age,p_obj.name))
      
      class Person(object):
      
          def __init__(self,name):
              self.name = name
      
      d = Dog('小黑',12)
      p = Person('山山')
      
      d.zhuren(p)  # 传入人的对象,dog依赖于person这个类。这样才能知道狗的主人是谁,这就是依赖关系
      
      
    • 组合关系:将一个类的对象封装到另一个对象的属性中去,就叫组合

      class Student():
      
          def __init__(self,name,age,clas,iphone,cls_obj):
              """
              学生类初始化方法
              :param name: 学生姓名
              :param age: 学生年龄
              :param clas: 学生班级
              :param iphone: 学生手机号
              """
              self.name = name
              self.age = age
              self.clas = clas
              self.iphone = iphone
              self.cla_obj = cls_obj
      
      
      class Clas():
      
          def __init__(self,teacher,begin_time):
              """
              初始化方法,
              :param teacher: 老师名
              :param begin_time: 开班时间
              """
              self.teacher = teacher
              self.begin_time = begin_time
      
      # s = Student('山山',24,'无聊班级',1300000000)
      # c = Clas('饭饭','2020-02-02')
      
      # 现在我想查询山山的开班时间,我该如何查看呢》?
      # 我是不是定义一个变量传入Clas的对象,再通过这个对象进行调用就可以了呢,哈哈哈
      c = Clas('饭饭','2020-02-02')
      s = Student('山山',24,'无聊班级',1300000000,c)
      print(s.cla_obj.teacher)
      print(s.cla_obj.begin_time)
      
      输出结果
      饭饭
      2020-02-02
      
    • 继承关系

      继承(英语:inheritance)是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B,就把这个A称为“B的子类别”,而把B称为“A的父类别”也可以称“B是A的超类”。继承可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。另外,为子类别追加新的属性和方法也是常见的做法。

      • 子类无任何属性和方法时,此时用的是父类的属性和方法
      class Animal(object):
      
          def __init__(self, name, age, sex):
              self.name = name
              self.age = age
              self.sex = sex
      
          def eat(self):
              print("{}在吃饭".format(self.name))
      
      
      class Person(Animal):
          pass
      
      p = Person('山山', 18, '男')  # 此时Person类是没有定义任何东西,但是它直接可以使用父类的属性
      print(p.name)
      
      • 子类中有,但是父类没有的属性or方法时,优先使用子类的
      class Animal(object):
      
          def __init__(self, name, age, sex):
              self.name = name
              self.age = age
              self.sex = sex
      
          def eat(self):
              print("{}在吃饭".format(self.name))
              
      class Dog(Animal):
      
          def __init__(self, name, age, sex, breed):  # breed品种
              self.name = name
              self.age = age
              self.sex = sex
              self.breed = breed
      
          def run(self):
              print("这个{}品种的狗在跑".format(self.breed))
      
      d = Dog('小黑', 2, '公', '京巴')  # 此时父类中没有breed的属性,但是子类有,所以使用的是子类的属性
      print(d.breed)
      d.run()
      
      • 子类中有,父类中也有相同名称的属性or方法,优先使用子类的(方法的重写)
      class Animal(object):
      
          def __init__(self, name, age, sex):
              self.name = name
              self.age = age
              self.sex = sex
      
          def eat(self):
              print("{}在吃饭".format(self.name))
       
      class Pig(Animal): # 完全重写父类的方法,此时只会用子类的
          
          def __init__(self,breed) # 调用时只需要传入一个参数即可
          	self.breed = breed
      
      
      
      class Person(Animal):
      
          def eat(self):
              print('这是Person类的方法')
              
      pig = Pig('短尾猪')
      print(pig.breed)
      
      p = Person('山山', 18, '男')  # 此时Person类是没有定义任何东西,但是它直接可以使用父类的属性
      p.eat()
      
      
      • 不想完全重写父类的方法,在子类中也使用父类的方法
      # 此时想在子类中也应用父类的方法
      # 方法一
       class Pig(Animal):
      
           def eat(self):
               Animal.eat(self)
               print('这个事Pig类的eat方法')
      
      pig = Pig('猪猪',20,'公')
      pig.eat()
      
      # 方法二
      class Pig(Animal):
      
          def eat(self):
              super(Pig,self).eat()   #使用super,格式super(子类名,self).方法
              # super().eat()
              print('这个事Pig类的eat方法')
      
      pig = Pig('猪猪',20,'公')
      pig.eat()
      
      • 不想完全重写父类的属性,在子类中也使用父类的属性
      # 不完全重写父类的私有属性
      # 方法一
      class Pig(Animal):
          def __init__(self,name,age,sex,breed):
              Animal.__init__(self,name,age,sex)
              self.breed = breed
      
          def eat(self):
              super(Pig,self).eat()
              print('这个事Pig类的eat方法')
      
      
      方法二
      class Pig(Animal):
          def __init__(self,name,age,sex,breed):
              super(Pig,self).__init__(name,age,sex)
              # super().__init__(name,age,sex)
              self.breed = breed
      
          def eat(self):
              super(Pig,self).eat()
              print('这个事Pig类的eat方法')
      
      pig = Pig('猪猪',20,'公','短尾猪')
      print(pig.name)
      print(pig.breed)
      
      输出结果:
      猪猪
      短尾猪
      
  • 相关阅读:
    Mvc+三层(批量添加、删除、修改)
    js中判断复选款是否选中
    EF的优缺点
    Git tricks: Unstaging files
    Using Git Submodules
    English Learning
    wix xslt for adding node
    The breakpoint will not currently be hit. No symbols have been loaded for this document."
    Use XSLT in wix
    mfc110ud.dll not found
  • 原文地址:https://www.cnblogs.com/shanshan-test/p/12879588.html
Copyright © 2011-2022 走看看