本文目录:

一、组合

二、封装

三、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. Java日志体系(四)slf4j

    1.1 简介 与commons-logging相同,slf4j也是一个通用的日志接口,在程序中与其他日志框架结合使用,并对外提供服务. Simple Logging Facade for Java简称 ...

  2. Java内部类(2):普通的成员内部类

    在成员内部类中要注意两点 第一:成员内部类中不能存在任何static的变量和方法: 第二:成员内部类是依附于外围类的,所以只有先创建了外围类才能够创建内部类. 接下来是两个例子(关键字:.this . ...

  3. python 粘包现象

    一. 粘包现象 1. 粘包现象的由来(1)TCP属于长连接,当服务端与一个客户端进行了连接以后,其他客户端需要(排队)等待.若服务端想要连接另一个客户端,必须首先断开与第一个客户端的连接. (2)缓冲 ...

  4. Python 常用模块(1) -- collections模块,time模块,random模块,os模块,sys模块

    主要内容: 一. 模块的简单认识 二. collections模块 三. time时间模块 四. random模块 五. os模块 六. sys模块 一. 模块的简单认识 模块: 模块就是把装有特定功 ...

  5. Spring Boot Lombok配置

    Spring Boot Lombok配置 依赖添加 dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.2' compi ...

  6. centos超详细搭建jumpserver跳板机

    一.官网 https://docs.jumpserver.org/zh/master/  二.一站式.分布式安装文档  三.选择最新版 四.在线安装文档 五.按文档部署(4G.二核.50G硬盘)  六 ...

  7. 潜在语义分析 LSA

    简单介绍 LSA和传统向量空间模型(vector space model)一样使用向量来表示词(terms)和文档(documents),并通过向量间的关系(如夹角)来判断词及文档间的关系:不同的是, ...

  8. D3 GEO应用专题(一):绘制旋转的3D地球

    https://gallery.echartsjs.com/explore.html#sort=rank~timeframe=all~author=all 雷达图 https://blog.csdn. ...

  9. java.lang.ClassNotFoundException: org.apache.commons.dbutils.ResultSetHandle

    原因是这两个地方都得导入dbutils的jar包,一般出错是因为WEB-INF下没有导入包,记得导入,然后buildPath即可

  10. Springboot Rabbitmq 使用Jackson2JsonMessageConverter 消息传递后转对象

    Springboot为了应对高并发,接入了消息队列Rabbitmq,第一版验证时使用简单消费队列: //发送端 AbstractOrder order =new Order(); rabbitmqTe ...