类的组合与封装

一、组合

解决类与类之间代码冗余问题有两种解决方案:        1、继承 2、组合        1、继承:描述的是类与类之间,从属关系        2、组合:描述的是类与类之间的关系,是一种什么有什么关系            一个类产生的对象,该对象拥有一个属性,这个属性的值是来自于另外一个类的对象

class Date:                def __init__(self,year,mon,day):                    self.year = year                    self.mon = mon                    self.day = day

def tell_birth(self):                    print(‘出生年月日<%s-%s-%s>‘ % (self.year, self.mon, self.day))

class OldboyPeople:                school = ‘oldboy‘

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

class OldboyTeacher(OldboyPeople):                def __init__(self,name,age,sex,level,salary):                    super().__init__(name,age,sex)                    self.level=level                    self.salary=salary

def change_score(self):                    print(‘teacher %s is changing score‘ %self.name)

class Oldboystudent(OldboyPeople):                def __init__(self,name,age,sex,course,):                    super().__init__(name,age,sex,)                    self.course=course

def choose(self):                    print(‘student %s choose course‘ %self.name)

tea1=OldboyTeacher(‘egon‘,18,‘male‘,9,3.1)            date_obj=Date(2000,1,1)

tea1.birth=date_obj

stu1=Oldboystudent(‘张三‘,16,‘male‘,‘linux‘)            stu1.birth=Date(2002,3,3)            stu1.birth.tell_birth()

二、封装

什么是封装        装就是把一堆属性存起来,封的概念就把这些属性给隐藏起来        强调:封装单从字面意思去看等同于隐藏,但其实封装绝对不是单纯意义的隐藏

如何把属性隐藏起来,就在属性前面加上__开头(注意不要加__结尾)        注意:        1、其实这种隐藏只是一种语法上的变形,对外不对内        为一个属性名加__开头(注意不要加__结尾),会在类定义阶段将属性名统一变形:_自己的类名__属性名

class Foo:                __x=1111 #_Foo__x=1111                def __init__(self,y):                    self.__y=y #self._Foo__y=y

def __f1(self): #_Foo__f1                    print(‘Foo.f1‘)

def get_y(self):                    print(self.__y) # print(self._Foo__y)

obj=Foo(22222)            print(obj.x)            print(obj.__x)            obj.__f1()            print(obj.y)            print(obj.__y)            print(Foo.__dict__)            print(obj._Foo__x)            print(obj._Foo__y)            obj._Foo__f1()

obj.get_y()

2、这种语法意义上变形,只在类定义阶段发生一次,类定义之后,新增的__开头的属性都没有变形的效果

Foo.__aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=1            print(Foo.__dict__)

3、如果父类不想让子类覆盖自己的方法,可以在方法名前加__开头            class Foo:                def __f1(self): #_Foo__f1                    print(‘Foo.f1‘)

def f2(self):                    print(‘Foo.f2‘)                    self.__f1() #obj._Foo__f1()

class Bar(Foo):                def __f1(self): #_Bar__f1                    print("Bar.f1")

obj=Bar()

obj.f2()

强调:封装单从字面意思去看等同于隐藏,但其实封装绝对不是单纯意义的隐藏

2、为什么要用封装

1 封装数据属性的目的:把数据属性封装起来,然后需要开辟接口给类外部的使用者使用,好处是我们可以在接口之上添加控制逻辑,从而严格空间访问者对属性的操作class People:    def __init__(self,name,age):        self.__name=name        self.__age=age

def tell_info(self):        # u=input(‘user>>: ‘).strip()        # p=input(‘pwd>>: ‘).strip()        # if u == ‘egon‘ and p == ‘123‘:            print(self.__name,self.__age)

def set_info(self,name,age):        if type(name) is not str:            raise TypeError(‘用户名必须为str类型‘)        if type(age) is not int:            raise TypeError(‘年龄必须为int类型‘)        self.__name=name        self.__age=age

p=People(‘egon‘,18)

# p.tell_info()# p.tell_info()

# p.set_info(‘EGON‘,19)# p.tell_info()

# p.set_info(353535353535353535,20)p.set_info(‘EGON‘,‘20‘)

#2 封装函数属性的目的:为了隔离复杂度

class ATM:    def __card(self):        print(‘插卡‘)    def __auth(self):        print(‘用户认证‘)    def __input(self):        print(‘输入取款金额‘)    def __print_bill(self):        print(‘打印账单‘)    def __take_money(self):        print(‘取款‘)

def withdraw(self):        self.__card()        self.__auth()        self.__input()        self.__print_bill()        self.__take_money()

obj=ATM()obj.withdraw()

封装的终极奥义:明确地区分内外,对外是隐藏的,对内是开放的

原文地址:https://www.cnblogs.com/zhaodafa/p/8823866.html

时间: 2024-11-15 06:15:52

类的组合与封装的相关文章

计算机程序的思维逻辑 (14) - 类的组合【转】

正所谓,道生一,一生二,二生三,三生万物,如果将二进制表示和运算看做一,将基本数据类型看做二,基本数据类型形成的类看做三,那么,类的组合以及下节介绍的继承则使得三生万物. 上节我们通过类Point介绍了类的一些基本概念和语法,类Point中只有基本数据类型,但类中的成员变量的类型也可以是别的类,通过类的组合可以表达更为复杂的概念. 程序是用来解决现实问题的,将现实中的概念映射为程序中的概念,是初学编程过程中的一步跨越.本节通过一些例子来演示,如何将一些现实概念和问题,通过类以及类的组合来表示和处

计算机程序的思维逻辑 (14) - 类的组合

正所谓,道生一,一生二,二生三,三生万物,如果将二进制表示和运算看做一,将基本数据类型看做二,基本数据类型形成的类看做三,那么,类的组合以及下节介绍的继承则使得三生万物. 上节我们通过类Point介绍了类的一些基本概念和语法,类Point中只有基本数据类型,但类中的成员变量的类型也可以是别的类,通过类的组合可以表达更为复杂的概念. 程序是用来解决现实问题的,将现实中的概念映射为程序中的概念,是初学编程过程中的一步跨越.本节通过一些例子来演示,如何将一些现实概念和问题,通过类以及类的组合来表示和处

组合&amp;多态&amp;封装

组合&多态&封装 一.组合 1.1什么是组合 对象的属性是另一个对象 class Foo: pass class Bar: pass f = Foo() f.bar = Bar() 1.2 为什么要用组合 减少代码冗余 1.3 如何使用组合 首先我们有老师类和学生类,他们都有共同的属性,课程姓名,课程价格,课程时间,为了避免代码冗余,我们就需要用组合. #这样的代码,我们看起来是不是和繁琐,那我们就把他们相同的属性拿出来,重新定义一个类,用的时候,我们就直接传入这个对象就好了. class

类的组合

1.类的组合:类中的成员数据是另一个类的对象.类组合的构造函数:原则:不仅要负责对本类中的基本类型成员数据赋初值,也要对对象成员初始化. 2.构造函数的调用顺序: 1.调用内嵌对象的构造函数(按内嵌时的声明顺序,先声明者先构造): 2.调用本类的构造函数 3.析构函数的调用顺序: 1.调用本类的析构函数: 2.调用内嵌对象的析构函数(按内嵌时的声明顺序,先声明者先析构). 4.若调用默认构造函数(即无形参的),则内嵌对象的初始化也将调用相应的默认构造函数. 5.类声明的方式有两种:使用前向引用声

【C++基础】类的组合

所谓类的组合是指:类中的成员数据是还有一个类的对象或者是还有一个类的指针或引用.通过类的组合能够在已有的抽象的基础上实现更复杂的抽象. 比如: 1.按值组合 #include<iostream.h> #include<math.h> class Point { public: Point(int xx,int yy)//构造函数 { x=xx; y=yy; cout<<"Point's constructor was called"<<e

Python学习之旅—面向对象进阶知识:类的命名空间,类的组合与继承

前言 上篇博客笔者带领大家初步梳理了Python面向对象的基础知识,本篇博客将专注于解决三个知识点:类的命名空间,类的组合以及面向对象的三大特性之一继承,一起跟随笔者老看看今天的内容吧. 1.类的命名空间 在上一篇博客中,我们提到过对象可以动态添加属性,一起来回忆下昨天的知识点,看如下的代码: class A: pass a = A() a.name = 'alex' print(a.name) 这里我们手动为a对象添加了一个属性name,然后直接打印可以得到a对象的名称.通过这个例子,我们可以

day31 类的组合及继承,文件目录规范

Python之路,Day18 = Python基础18-面向对象继承与组合 类的继承 1 def talk(): 2 print("I am come from talk..a") 3 4 class Animal: 5 def say(self): 6 print("say") 7 8 class Person(object): 9 def __init__(self, name, age): 10 self.name = name 11 self.age = a

Day18:类的抽象、类的组合应用

一.抽象类 1.什么是抽象类 抽象类是一个特殊的类,它的特殊之处在于只能被继承,不能被实例化. 2.为什么要有抽象类 如果说类是从一堆对象中抽取相同的内容而来的,那么抽象类就是从一堆类中抽取相同的内容而来的,内容包括数据属性和函数属性. 比如我们有香蕉的类,有苹果的类,有桃子的类,从这些类抽取相同的内容就是水果这个抽象的类,你吃水果时,要么是吃一个具体的香蕉,要么是吃一个具体的桃子......你永远无法吃到一个叫做水果的东西. 从设计角度去看,如果类是从现实对象抽象而来的,那么抽象类就是基于类抽

转 OC温故:类的三大特性(封装,继承,多态)

原文标题:OC学习篇之---类的三大特性(封装,继承,多态) 我们都知道,面向对象程序设计中的类有三大特性:继承,封装,多态,这个也是介绍类的时候,必须提到的话题,那么今天就来看一下OC中类的三大特性: 一.封装 封装就是对类中的一些字段,方法进行保护,不被外界所访问到,有一种权限的控制功能,Java中有四种访问权限修饰符: 1 public,default,protected,private 访问权限依次递减,这样我们在定义类的时候,哪些字段和方法不想暴露出去,哪些字段和方法可以暴露,可以通过