面向对象之组合

Posted afrafre

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面向对象之组合相关的知识,希望对你有一定的参考价值。

面对对象精髓: 将数据和处理数据的方法绑定成一个对象

       获得了对象就同时获得了数据和方法

组合: 多个对象放在一起,也可以降低代码冗余。

   程序中一个对象将另一个对象作为自己的属性

继承和组合的区别: 

        继承:是一种类之间的包含关系( 学生 是 人类)

        组合:是一种拥有的关系(学生类拥有手机类)  

          

 

class Person:
    def __init__(self,name,age,sex):
        self.name = name
        self.age = age
        self.sex = sex

class Teacher(Person):  # 继承关系
    def __init__(self,name,age,sex,salary,level):
        super().__init__(name,age,sex)
        self.salary = salary
        self.level = level


    def set_score(self):
        print(%s 正在为学生打分。。。% self.name)

class Student(Person): # 继承关系
    def __init__(self,name,age,sex,number):
        super().__init__(name,age,sex)
        self.number = number

    def get_info(self):
        print(self.__dict__)

    def select_course(self):
        print(%s 正在选课。。。%self.name)

# 为学生添加各种新属性,比如手机,电脑,Student 中增加大量的属性和方法
# 解决办法为组合(程序中一个对象将另一个对象作为自己的属性

# 添加手机
class Phone:
    def __init__(self,phone,operator,address):
        self.phone = phone
        self.operator = operator
        self.address = address
    def call(self):
        print(%s 正在拨号。。。 % self.phone)

stu = Student(egon,man,38,007)
p1 = Phone(18745632456,移动,shanghai)

stu.phone = p1   # 组合
stu.phone.call()

 生成一个学生类: stu = Student(‘ 属性‘)    生成一个手机类: p1 = Phone(‘属性‘)  

           为学生增加(手机)属性: stu.phone = p1   

           然后可以通过stu调用p1中的方法:stu.phone.call

 

 封装: 将内容(即属性或方法)隐藏起来,但不是单纯的隐藏

     隐藏内部实现细节,对外提供接口

为什么封装:提高安全性(cpu频率,缓冲区大小)

    给访问和修改增加额外的逻辑判断

如何使用封装:

    在python中权限分为两种:一种公开和私有的

     在属性或方法名前加两个下划线  例: self.__idcard = idcard   -----> 将该属性设置为私有

私有的特性: 只能在类内部访问(对象.__idcard),外部无法进行访问

    外部调用方法来访问和修改被隐藏的属性,需要提供相应的设置器和访问器

    get( 访问器): 用于获取

    set(设置器) 用于设置

 

class Student:
    def __init__(self,name,sex,age,idcard):
        self.name = name
        self.sex = sex
        self.age = age
        self.__idcard = idcard # 应该设置成私有的

    def sayhi(self):
        print(hello I am %s ,my age is %s,sex is %s%(self.name,self.age,self.sex))
    # 除idcard属性外其他都是公开的,可以在外部任意调用
def test(self): print(self.__idcard) # 内部可以访问
  
  def get_idcard(self): # 可以使用方法将内部封装的方法返回出去(问题:如果可以直接返回,就不需要封装了,get_idcard2()
    return self.__idcard

  # 封装的用法,即实现了隐藏,又提供了访问接口(即密码)
  def get_idcard2(self,pwd): # 密码验证身份
    if pwd == ‘123‘
      return self.__idcard
    else:
      print(‘ 没权限!)

  def set_idcard(self,pwd,new_id): #get 用来获取, set用来设置
    if pwd == ‘123‘:
      self.__idcard = new_id
    else:
      print(‘没权限‘) stu
= Student(egon,man,20,7930r47097070) stu.sayhi() stu.test()
stu.get_idcard()
结果:

hello I am egon ,my age is 20,sex is man
7930r47097070


 






















以上是关于面向对象之组合的主要内容,如果未能解决你的问题,请参考以下文章

面向对象之组合封装多态性鸭子类型

面向对象之多态

Python之面向对象的组合多态菱形问题子类中重用父类的两种方式

PHP面向对象之访问者模式+组合模式

面向对象概论之继承简述,组合简述,菱形继承简述

Python--面向对象的程序设计之多继承组合应用开发软件规范