1.封装与扩展性

封装在于明确区分内外,使得类实现者可以修改封装内的东西而不影响外部调用的代码;而外部使用者只知道一个接口(函数),只要接口(函数)名,参数不变,使用者的代码永远无需改变。这就提供了一个良好的合作基础——或者说,只要这个基础约定不变,则代码改变不足为虑。

def __init__(self,width,length):

        self.width=width

        self.length=length

    def area(self):#对外提供了接口,隐藏了内部的实现细节,此时求的是面积

        return self.width*self.length

#使用者

r1=Room(30,20)

print(r1)

print(r1.area())#使用者调用接口area

<__main__.Room object at 0x03720650>

600

  

#类的设计者,轻松的扩展了功能,而类的使用者完全不需要更改自己的代码

class Room:

    def __init__(self,width,length,higt):

        self.width=width

        self.length=length

        self.higth=higt

    def area(self):

        return self.length*self.width*self.higth

    #对外提供的接口,隐藏内部实现,此时求的是体积,内部逻辑变了,只需要修改一行

    # 就可以实现,而且外部调用感知不到,仍然使用该方法,但是功能已经变了

r2=Room(30,20,20)

print(r2)

print(r2.area())

<__main__.Room object at 0x039B0750>

12000

  

2.静态封装

Staticmethod 使用方法

静态方法是一种普通函数,位于类定义的命名空间中,不会对任何实例类型进行操作,python为我们内置了函数staticmethod来把类中的函数定义成静态方法

class Foo:

    @staticmethod#装饰器,实例在使用时丧失了自动传值的机制

    def spam(x,y,z):#把函数spam做成静态方法

        print(x,y,z)

f1=Foo()

f1.spam(1,2,3)#此时函数中有几个参数就需要传几个值

1 2 3

  

应用场景

import time

class Date:

    def __init__(self,year,month,day):

        self.year=year

        self.month=month

        self.day=day

    @staticmethod

    def now():#用Date.now()的形式去产生实例,该实例是当前的时间

        t=time.localtime()#获取结构式的时间格式

        return Date(t.tm_year,t.tm_mon,t.tm_mday)#新建实例并返回

    @staticmethod

    def tomorrow():#用Date.now()的形式去产生实例,该实例是明天的时间

        t=time.localtime(time.time()+86400)

        return Date(t.tm_year,t.tm_mon,t.tm_mon)

a=Date(1987,11,22)#自己定义时间

b=Date.now()#采用当前时间

c=Date.tomorrow()#采用明天的时间

print(a.year,a.month,a.day)

print(b.year,b.month,b.day)

print(c.year,c.month,c.day)

1987 11 22

2017 4 22

2017 4 23

  

@staticmethod相当于给类(类的功能:属性应用和实例化)添加了一个实例化的功能,之前只能是类()进行,现在扩展一个功能,直接加@staticmethod,对象可以调用。

如果不使用@staticmethod,实例调用时就会产生绑定方法,必须传入self;

但凡是定义在类的内部,并且没有被任何装饰器修饰过的方法,都是绑定方法:有自动传值功能。

3.类方法

@classmethod

类方法是给类使用的,类在使用时会将类本身当做参数传给类方法的第一个参数,,python为我们内置了函数classmethod来把类中的函数定义成类方法

class Foo:

    def bar(self):

        pass

    @classmethod

    def test(cls):#把一个方法绑定到类:类.绑定到类的方法()

        #会把类本身当做第一个参数自动传给绑定到类的方法(相当于self的概念)

        print(cls)

print(Foo.bar)

print(Foo.test)

<function Foo.bar at 0x032D4078>

<bound method Foo.test of <class '__main__.Foo'>>

  

实现类本身当做第一个参数自动传给绑定到类的方法

class Foo:

    def bar(self):

        pass

    @classmethod

    def test(cls):#把一个方法绑定到类:类.绑定到类的方法()

        #会把类本身当做第一个参数自动传给绑定到类的方法(相当于self的概念)

        print(cls)

# print(Foo.bar)

# print(Foo.test)

Foo.test()

<class '__main__.Foo'>

  

class Foo:

    def bar(self):

        pass

    @classmethod

    def test(cls,k):#把一个方法绑定到类:类.绑定到类的方法()

        #会把类本身当做第一个参数自动传给绑定到类的方法(相当于self的概念)

        print(cls,k)#拿到一个类的内存地址,就可以实例化或者引用类的属性了

# print(Foo.bar)

# print(Foo.test)

Foo.test(1)

<class '__main__.Foo'> 1

  

__str__的用法

必须返回字符串

更正以后:

打印对象会触发类的str方法。

str小结:

定义在类内部,必须返回一个字符串类型;

什么时候会触发它的执行呢?

打印由这个类产生的对象时,会触发执行

Str和classmethod应用场景

import time

class Date:

    def __init__(self,year,month,day):

        self.year=year

        self.month=month

        self.day=day

    @classmethod#绑定到子类

    def now(cls):#用Date.now()的形式去产生实例,该实例是当前的时间

        t=time.localtime()#获取结构式的时间格式

        return cls(t.tm_year,t.tm_mon,t.tm_mday)#新建实例并返回

    @classmethod#绑定到子类

    def tomorrow(cls):#用Date.now()的形式去产生实例,该实例是明天的时间

        t=time.localtime(time.time()+86400)

        return cls(t.tm_year,t.tm_mon,t.tm_mday)

class EuroDate(Date):

    def __str__(self):# 打印由这个类产生的对时,会触发执行

        return "年:%d,月:%d,日:%d"%(self.year,self.month,self.day)

e1=EuroDate.now()

print(e1)

  

python之封装与扩展性的更多相关文章

  1. python基础----封装、封装与扩展性

    从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有egon和alex一起装进麻袋,然后把麻袋封上口子.但其实这种理解相当片面 首先我们要了解 要封装什么 你钱包的有多少钱(数 ...

  2. 面向对象 - 1.封装之如何实现属性的隐藏/2.封装的意义/3.封装与扩展性/4.property的使用

    1.封装之如何实现属性的隐藏封装: __x=1 # 把数据属性隐藏 (如何实现隐藏) 类定义阶段 __开头发生了变形 __x --> _A__x特点: 1.在类外部无法直接:obj.__Attr ...

  3. 面向对象编程(封装、封装的意义、封装与扩展性、@property)

    1.封装之如何实现属性的隐藏 封装: __x=1 # 把数据属性隐藏 (如何实现隐藏) 类定义阶段 __开头发生了变形 __x --> _A__x特点: 1.在类外部无法直接:obj.__Att ...

  4. python面向对象-封装-property-接口-抽象-鸭子类型-03

    封装 什么是封装: # 将复杂的丑陋的隐私的细节隐藏到内部,对外提供简单的使用接口 或 # 对外隐藏内部实现细节,并提供访问的接口 为什么需要封装 1.为了保证关键数据的安全性 2.对外部隐藏内部的实 ...

  5. 使用Lua脚本语言开发出高扩展性的系统,AgileEAS.NET SOA中间件Lua脚本引擎介绍

    一.前言 AgileEAS.NET SOA 中间件平台是一款基于基于敏捷并行开发思想和Microsoft .Net构件(组件)开发技术而构建的一个快速开发应用平台.用于帮助中小型软件企业建立一条适合市 ...

  6. Java并发编程:性能、扩展性和响应

    1.介绍 本文讨论的重点在于多线程应用程序的性能问题.我们会先给性能和扩展性下一个定义,然后再仔细学习一下Amdahl法则.下面的内容我们会考察一下如何用不同的技术方法来减少锁竞争,以及如何用代码来实 ...

  7. Class撑起了OOP世界的天。Class类是OO的基本单元,OO的世界都是通过一个一个的类协作完成的,提高软件的重用性、灵活性和扩展性(转)

    引言 在OO的工作中,我们一定会涉及到类,抽象类和接口.那么类和抽象类以及接口到底扮演的什么角色? 本文主要是从人类社会的角度阐述类与抽象类以及接口的“社会”关系,从而让我们抛弃书上的那些死记硬背的概 ...

  8. 设计模式如何提升 vivo 营销自动化业务扩展性 | 引擎篇01

    在<vivo 营销自动化技术解密 |开篇>中,我们从整体上介绍了vivo营销自动化平台的业务架构.核心业务模块功能.系统架构和几大核心技术设计. 本次带来的是系列文章的第2篇,本文详细解析 ...

  9. Atitit.兼具兼容性和扩展性的配置方案attilax总结

    Atitit.兼具兼容性和扩展性的配置方案attilax总结 文件配置法1 Jdbc多数据源文件配置发1 Bat文件配置法1 改进的文件配置法(采用类似i18n技术) 推荐1 使用自动化pc_id的方 ...

随机推荐

  1. Oracle Instant Client(即时客户端) 安装与配置

    一.下载 下载地址:http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html 这是Ora ...

  2. 【回顾】html属性、标题、段落、文本格式化

    1.HTML 属性 HTML 元素可以设置属性 属性可以在元素中添加附加信息 属性一般描述于开始标签 属性总是以名称/值对的形式出现,比如:name="value". HTML 提 ...

  3. 批处理打开关闭服务(ArcSDE+Oracle92的)

    转自:http://crmhf.blog.163.com/blog/static/7707820320097199560516/ 批处理打开服务:echo offnet start "Arc ...

  4. Python3 序列解包

    转载自:https://blog.csdn.net/yilovexing/article/details/80576788 序列解包是 Python 3.0 之后才有的语法 什么是序列解包呢?先看一个 ...

  5. 【python】常用第三方模块

    No1: [Pillow]图像处理标准库 缩放 from PIL import Image # 打开一个jpg图像文件,注意是当前路径: im = Image.open('test.jpg') # 获 ...

  6. Python NLTK 自然语言处理入门与例程(转)

    转 https://blog.csdn.net/hzp666/article/details/79373720     Python NLTK 自然语言处理入门与例程 在这篇文章中,我们将基于 Pyt ...

  7. boost 正则表达式 regex

    boost 正则表达式 regex   环境安装 如果在引用boost regex出现连接错误,但是引用其他的库却没有这个错误,这是因为对于boost来说,是免编译的,但是,正则这个库 是需要单独编译 ...

  8. Django之第三方登陆模块

    Django之第三方登陆模块 前期准备 安装 django-allauth pip install django-allauth 注意,django-allauth 需要在 Django1.10以上版 ...

  9. P2158 [SDOI2008]仪仗队

    P2158 [SDOI2008]仪仗队图是关于y=x对称的,横纵坐标一定是互质的否则在之前就被扫过了,所以就可以用欧拉函数再*2就完了. #include<iostream> #inclu ...

  10. JAVAScript:前端模块化开发

    目录 一:前端模块化概要 1.1.模块化概要 1.2.函数封装 1.3.对象封装 1.4.立即执行函数表达式(IIFE) 1.5.模块化规范 1.5.1.CommonJS 1.5.2.AMD((Asy ...