本文目录:

一、组合

二、封装

三、propert装饰器

四、多态

一、组合

1. 什么是组合

一个对象的属性是来自于另外一个类的对象,称之为组合
 

2. 为何用组合

组合也是用来解决类与类代码冗余的问题
 

3. 如何用组合

class Foo:
aaa = 1111 def __init__(self, x, y):
self.x = x
self.y = y def func1(self):
print('Foo内的功能') class Bar:
bbb = 2222 def __init__(self, m, n):
self.m = m
self.n = n def func2(self):
print('Bar内的功能') obj1 = Foo(10, 20)
obj2 = Bar(30, 40) obj1.xxx = obj2 print(obj1.x, obj1.y, obj1.aaa, obj1.func1)
print(obj1.xxx.m, obj1.xxx.n, obj1.xxx.bbb, obj1.xxx.func2) class OldboyPeople:
school = 'Oldboy' def __init__(self, name, age, gender, course_name, course_price, course_period):
self.name = name
self.age = age
self.gender = gender
self.course_name = course_name
self.course_price = course_price
self.course_period = course_period class OldboyStudent(OldboyPeople):
def choose_course(self):
print('%s is choosing course' % self.name) class OldboyTeacher(OldboyPeople): def __init__(self, name, age, gender, level, salary, course_name, course_price, course_period):
OldboyPeople.__init__(self, name, age, gender)
self.level = level
self.salary = salary def score(self, stu, num):
stu.num = num
print('老师%s给学生%s打分%s' % (self.name, stu.name, num)) stu1 = OldboyStudent('egon', 18, 'male', 'Python开发', 3000, '5mons')
stu2 = OldboyStudent('kevin', 38, 'male', 'Python开发', 3000, '5mons') def tell_course(obj):
print('课程名:<%s> 价钱:[%s] 周期:[%s]' % (obj.course_name, obj.course_price, obj.course_period)) tell_course(stu1)
tell_course(stu2) class OldboyPeople:
school = 'Oldboy' def __init__(self, name, age, gender):
self.name = name
self.age = age
self.gender = gender class OldboyStudent(OldboyPeople): def choose_course(self):
print('%s is choosing course' % self.name) class OldboyTeacher(OldboyPeople):
def __init__(self, name, age, gender, level, salary):
OldboyPeople.__init__(self, name, age, gender)
self.level = level
self.salary = salary def score(self, stu, num):
stu.num = num
print('老师%s给学生%s 打分%s' % (self.name, stu.name, num)) class Course: def __init__(self, course_name, course_price, course_period):
self.course_name = course_name
self.course_price = course_price
self.course_period = course_period def tell_course(self):
print('课程名:<%s> 价钱:[%s] 周期:[%s]' % (self.course_name, self.course_price, self.course_period)) python_obj = Course('python开发', 3000, '5mons')
linux_obj = Course('linux运维', 5000, '3mons') stu1 = OldboyStudent('egon', 18, 'male')
stu1.courses = []
stu1.courses.append(linux_obj)
stu1.courses.append(python_obj)
stu1.courses[0].tell_course() stu2 = OldboyStudent('kevin', 38, 'male')

二、封装

1. 什么是封装

装指的是把属性装进一个容器
封指的是隐藏的意思,但是这种隐藏式对外不对内的

2. 为何要封装

封装不是单纯意义的隐藏
封装数据属性的目的:将数据属性封装起来,类外部的使用就无法直接操作该数据属性了
需要类内部开一个接口给使用者,类的设计者可以在接口之上附加任意逻辑,从而严格控制使用者对属性的操作
封装函数属性的目的:隔离复杂度

3. 如何封装

只需要在属性前加上__开头,该属性就会被隐藏起来,该隐藏具备的特点:
1. 只是一种语法意义上的变形,即__开头的属性会在检测语法时发生变形_类名__属性名
2. 这种隐藏式对外不对内的,因为在类内部检测语法时所有的代码统一都发生的变形
3. 这种变形只在检测语法时发生一次,在类定义之后新增的__开头的属性并不会发生变形
4. 如果父类不想让子类覆盖自己的属性,可以在属性前加__开头
class Foo:
__x=111 #_Foo__x
def __init__(self,m,n):
self.__m=m # self._Foo__m=m
self.n=n def __func(self): #_Foo__func
print('Foo.func') def func1(self):
print(self.__m) #self._Foo__m
print(self.__x) #self._Foo__x # print(Foo.__dict__)
# Foo.__x
# Foo.__func
# print(Foo._Foo__x)
# print(Foo._Foo__func) obj=Foo(10,20)
# print(obj.__dict__)
# print(obj.n)
# print(obj.__m)
# print(obj._Foo__m) # obj.func1() # obj.__yyy=3333
# print(obj.__dict__)
# print(obj.__yyy) # Foo.__zzz=444
# print(Foo.__dict__)
# print(Foo.__zzz) # class Foo:
# def __f1(self): #_Foo__f1
# print('Foo.f1')
#
# def f2(self):
# print('Foo.f2')
# self.__f1() #self._Foo__f1
#
# class Bar(Foo):
# def __f1(self): #_Bar__f1
# print('Bar.f1')
#
# obj=Bar()
# obj.f2() # 封装数据属性的真实意图
# class People:
# def __init__(self,name,age):
# self.__name=name
# self.__age=age
#
# def tell_info(self):
# print('<name:%s age:%s>' %(self.__name,self.__age))
#
# def set_info(self,new_name,new_age):
# if type(new_name) is not str:
# print('名字必须是str类型傻叉')
# return
# if type(new_age) is not int:
# print('年龄必须是int类型傻叉')
# return
# self.__name=new_name
# self.__age=new_age
#
# def clear_info(self):
# del self.__name
# del self.__age
#
# obj=People('egon',18)
#
# obj.tell_info()
# obj.set_info('egon',18) # 封装函数属性的真实意图
# 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()
#
# a=ATM()
# a.withdraw()

三、property装饰器

'''
  例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个属性,更便于理解)   成人的BMI数值:
  过轻:低于18.5
  正常:18.5-23.9
  过重:24-27
  肥胖:28-32
  非常肥胖, 高于32
  体质指数(BMI)=体重(kg)÷身高^2(m)
  EX:70kg÷(1.75×1.75)=22.86
'''
# class People:
# def __init__(self,name,weight,height):
# self.name=name
# self.weight=weight
# self.height=height
#
# @property
# def bmi(self):
# return self.weight / (self.height ** 2)
#
# obj=People('egon',70,1.82)
# obj.height=1.85
#
# print(obj.bmi) # 需要了解的property的用法
# class People:
# def __init__(self,name):
# self.__name=name
#
# @property
# def name(self):
# return '<name:%s>' %self.__name
#
# @name.setter
# def name(self,new_name):
# if type(new_name) is not str:
# print('名字必须是str类型')
# return
# self.__name=new_name
#
# @name.deleter
# def name(self):
# del self.__name
#
# obj=People('egon')
# print(obj.name)
#
# # obj.name=123
# # print(obj.name)
#
# del obj.name
# print(obj.__dict__) class People:
def __init__(self,name):
self.__name=name def xxx_name(self):
return '<name:%s>' %self.__name def yyy_name(self,new_name):
if type(new_name) is not str:
print('名字必须是str类型')
return
self.__name=new_name def zzz_name(self):
del self.__name name=property(xxx_name,yyy_name,zzz_name) obj=People('egon')
print(obj.name) # obj.name=123
# print(obj.name) del obj.name
print(obj.__dict__)

四、多态

1. 什么是多态

同一种事物的多种形态

2. 为何要用多态

多态性:指的是可以在不用考虑对象具体类型的前提下而直接使用对象下的方法

3. 如何用多态

# import abc
#
# class Animal(metaclass=abc.ABCMeta):
# @abc.abstractmethod
# def speak(self):
# pass
#
# # Animal() # 父类不能实例化,因为父类本身就是用来制定标准的
# class People(Animal):
# def speak(self):
# print('say hello')
# # def jiao(self):
# # print('say hello')
#
# class Dog(Animal):
# def speak(self):
# print('汪汪汪')
#
# class Pig(Animal):
# def speak(self):
# print('哼哼哼')
#
#
# peo=People()
# dog1=Dog()
# pig1=Pig()
# #
# #
# peo.speak()
# dog1.speak()
# pig1.speak()
def speak(animal):
animal.speak() speak(peo)
speak(dog1)
speak(pig1) class Memory:
def read(self):
print('mem read') def write(self):
print('mem write') class Disk:
def read(self):
print('disk read') def write(self):
print('disk write') class Cpu:
def read(self):
print('cpu read') def write(self):
print('cpu write') obj1=Memory()
obj2=Disk()
obj3=Cpu() obj1.read()
obj2.read()
obj3.read() # ''.__len__()
# [].__len__()
# len([1,2,3]) #[1,2,3].__len__()

python面向编程:类的组合、封装、property装饰器、多态的更多相关文章

  1. Python10/24--组合/封装/property装饰器/多态

    组合的应用: 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. 如何用组合 '''class Foo: aaa=111 ...

  2. python面向对象:组合、封装、property装饰器、多态

    一.组合二.封装三.property装饰器四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 3. ...

  3. python 全栈开发,Day22(封装,property,classmethod,staticmethod)

    一.封装 封装 : 广义上的 :把一堆东西装在一个容器里 狭义上的 :会对一种现象起一个专门属于它的名字 函数和属性装到了一个非全局的命名空间 —— 封装 隐藏对象的属性和实现细节,仅对外提供公共访问 ...

  4. 面向对象之组合、封装、多态、property装饰器

    概要: 组合 封装 property装饰器 多态 Python推崇鸭子类型:解耦合,统一标准(不用继承) 1. 组合 继承:会传递给子类强制属性 组合:解耦合,减少占用内存.如:正常继承,如果一个班级 ...

  5. 面向对象之 组合 封装 多态 property 装饰器

    1.组合 什么是组合? 一个对象的属性是来自另一个类的对象,称之为组合 为什么要用组合 组合也是用来解决类与类代码冗余的问题 3.如何用组合 # obj1.xxx=obj2''''''# class ...

  6. 组合+封装+property+多态+鸭子类型(day21)

    目录 昨日回顾 继承 什么是继承 继承的目的 什么是抽象 继承背景下,对象属性的查找顺序 派生 什么是派生 子类派生出新的属性,重用父类的属性 新式类和经典类 钻石继承的继承顺序 今日内容 一.组合 ...

  7. 面向对象(三)——组合、多态、封装、property装饰器

    组合.多态.封装.property装饰器 一.组合 1.什么是组合 组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象 class Foo(): pass class Bar(): pas ...

  8. 组合,多态与多态性,封装以及property装饰器介绍

    一:组合: 什么是组合:组合指的是某一个对象拥有一个属性,该属性的值是另外一个类的对象. 为何要用组合:通过为某一个对象添加属性(属性的值是另外一个类的对象)的方式,可以间接地将两个类关联/整合/组合 ...

  9. python学习13类2之封装

    '''''''''面向对象三大特性:封装,继承,多态1.封装: 类中以_或者__的属性,都是私有属性,禁止外部调用.'''class Student(object): def __init__(sel ...

随机推荐

  1. js如何控制select展开

    找了一圈也没找到靠谱的方案,后来通过动态的控制select的size属性实现了. 这也算是一种方法吧. 先判断option的数量n,然后把select的size调整到n,当用户选择后,再把size设置 ...

  2. flask(2.0)

    目录 一. Flask基础(一) 1.Flask启动 2.路由 3.Response 4.Request 5.Jinja2 6.session 二.Flask基础(二) 1.路由配置 (1)metho ...

  3. .Netcore 2.0 Ocelot Api网关教程(4)- 服务发现

    本文介绍Ocelot中的服务发现(Service Discovery),Ocelot允许指定一个服务发现提供器,之后将从中寻找下游服务的host和port来进行请求路由.关于服务发现的详细介绍请点击. ...

  4. v-for产生的列表,实现active的切换

    v-for生成序列 <ul> <li v-for="(info,index) in list" :key="info.id" @click=& ...

  5. elasticsearch的keyword与text的区别

    es2.*用户可忽略该文章.es 2.*版本里面是没有这两个字段!!! 当初接触es,最惊讶就是他的版本速度发布太快,这次主要讨论keyword与text的区别 在es 2.*版本里面是没有这两个字段 ...

  6. Postman的安装和升级

    安装postman Postman本地应用程序 Postman可以作为Mac,Windows和Linux操作系统的本地应用程序. 要安装Postman,请转到应用界面,并根据你的平台点击Mac/Win ...

  7. Buffer与Cache的理解

    Linux与Windows内存Linux系统的内存机制是优先使用物理内存,当物理内存还有空闲时,Linux系统是不会释放内存的,即使使用过内存的程序已经被关闭,这部分内存就用来做缓存了.换句话说,即使 ...

  8. 【React】- 1、React介绍

    React的开发背景 构建数据不断变化的大型应用 大量DOM操作   <----   自动DOM操作 数据变化 逻辑及其复杂   <----   状态对应内容(自动变化) 特点: - 简单 ...

  9. Jboss: Using reverse path on top path: /xxx

    环境 jboss 5.2 原因 加载资源的协议错误.一般在加载文件的时候,URL 都是以 file: 开头,但是在 jboss 上时,由于其虚拟化了路径,导致协议不一致,并且找不到外部的配置文件. 分 ...

  10. 洛谷P3353 【在你窗外闪耀的星星】

    题目真的好甜呢QwQ 冲着这题面也要来做 满分解法:线段树 我们暴力地把所有点建成一颗线段数 接着在从1到maxx里每个长度为 w的区间中执行区间求和 其实单点修改都不需要,可以在输入的时候统计出每个 ...