封装

封装:将一些数据,重要的信息等等放到一个地方(空间中)
class A:
country = 'China'
area = '深圳'
def __init__(self,name,age):
self.name = name
self.age = age a1 = A('小明',22)
a2 = A('小华',23)
print(a1.__dict__)
print(a2.__dict__)
多态
python默认支持多态
i = 777alex
i = ‘我是字符串’

鸭子类型:python会约定俗成制定一些行为规范,保持一致性

类的约束

对类进行一些正确的引导,约束,统一规范,满足正确的可发方式

两种约束方法:

方法一:python常用的一种,在父类写一个相同的方法pay,在此方法里面,主动抛出一个错误(raise)

class A:    # 这个父类制定了一个约束,规范,子类一定要有pay方法
def pay(self,money):
raise Exception('未定义的方法') class Alipay(A):
def pay(self,money):
print('alipay') class QQpay(A):
def zhifu(self,money): # 未按规定填写pay,而用了zhifu,会报 raise Exception('未定义的方法') 错误
print('QQpay') def pay(obj,money):
obj.pay(money) q = QQpay()
# pay(q,100)
a = Alipay()
pay(a,200)

方法二:在父类引用元类的抽象方法,抛出异常

from abc import ABCMeta,abstractmethod
class A(metaclass=ABCMeta): # 这个父类制定了一个约束,规范,子类一定要有pay方法
'''
抽象类,接口类:制定一个规范,强制执行。
'''
@abstractmethod
def pay(self,money):
raise Exception('未定义的方法') class Alipay(A):
def pay(self,money):
print('alipay') class QQpay(A):
def zhifu(self,money): # 未按规定填写pay,而用了zhifu,会报 raise Exception('未定义的方法') 错误
print('QQpay') def pay(obj,money):
obj.pay(money) q = QQpay()
pay(q,100)
# a = Alipay()
# pay(a,200)

类的私有成员

class Boss:

    name = 'alex'  # 公有静态属性  公有静态字段
__secretary =['女1', '男2', '眼膜'] # 私有静态属性 私有静态字段,有__表示 def __init__(self,username,password):
self.username = username # 公有对象属性 公有普通字段
self.__password = password # 私有对象属性 私有普通字段 def func(self): # 用方法查看私有静态属性
print(self.__secretary) def __func(self): # 私有方法
print('经常跟秘书加班....') class Boss_son(Boss):
def func(self):
print(self.__secretary)

私有成员:私有静态属性,私有对象属性,私有方法

私有静态属性:
类外部不能访问,通过对象可以外部访问

私有方法:

类外部和派生类不能访问

类的类方法,静态方法

class A:
name = 'barry' def __init__(self,a,b): # 双下方法
self.a = a
self.b = b def func(self): # 普通方法,实例方法
pass @staticmethod # 静态方法
def func1():
print(666) @classmethod # 类方法
def func2(cls):
print(777) @property # 属性
def bim(self):
print(111)

类方法:  @classmethod

类方法 他是通过类名直接调用的方法,类方法里面至少有一个参数,第一个参数默认cls

class A:
name = 'ehco'
@classmethod
def func(cls):
print(cls)
print(111)
def func1(self):
print(self) A.func() # 可以直接用类名调用的方法,传的参数是类名
A.func1(123) # 和上面的作对比 ,这个需要传参 # 对象可否调用类方法?
# 通过对象也可以调用类方法,cls 接受的不是对象空间而是类空间。
a = A()
a.func() # <class '__main__.A'> 类名的内存地址
类方法在哪里用?
对类中的属性方法直接操作,与对象无关,这样才会用到类方法。
# 判断有多少人注册

class ClassTest(object):
__num = 0 @classmethod
def addNum(cls):
cls.__num += 1 @classmethod
def getNum(cls):
return cls.__num # 这里我用到魔术函数__new__,主要是为了在创建实例的时候调用人数累加的函数。
def __new__(self):
ClassTest.addNum() # 实例化一个对象,就调用一次addNum
return super(ClassTest, self).__new__(self) #返回一个真正的__new__去创建空间 class Student(ClassTest):
def __init__(self):
self.name = '' a = Student()
b = Student()
print(ClassTest.getNum())

静态方法

为什么要静态方法;相似功能,保持一致性     @staticmethod

对象调用类里面的方法,不会影响方法的使用

import time

class TimeTest(object):
def __init__(self, hour, minute, second):
self.hour = hour
self.minute = minute
self.second = second @staticmethod
def showTime():
return time.strftime("%H:%M:%S", time.localtime()) print(TimeTest.showTime()) # 打印当前时间
t = TimeTest(2, 10, 10) # 示例对象t
nowTime = t.showTime() # t调用静态方法,并不会改变方法的执行
print(nowTime) # 打印当前时间

类的属性: @property     @xxx.setter    @ xxx.deleter

@property:属性

将一个方法伪装成属性,虽然在代码逻辑上没什么提高。但是让其看起来更合理

# 调用的时候少一个括号,看着没什么用
class Bmi:
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
pang = Bmi('小胖',75,1.76)
# print(pang.bmi()) # 如果没有@property,调用的时候加()
print(pang.bmi) # 如果有@property,调用的时候不要()

@xxx.setter   @ xxx.deleter  这两个和@property一起使用

class Market:
def __init__(self, name, price, discount):
self.name = name
self.__price = price # 私有属性
self.__discount = discount # 定义折扣 @property
def price(self): # 返回折后价
return self.__price * self.__discount @price.setter
def price(self, new_price): # 计算降价后的折扣价
self.__price = new_price / self.__discount @price.deleter
def price(self): # 删除价格
del self.__price
apple = Market('苹果',8,0.95)
print(apple.price)
apple.price = 7.5 # 看到改等式,就执行@price.setter。并把7.5传给 new_price
print(apple.price)
del apple.price # 看到del price,就执行@price.deleter
print(apple.price)

异常处理 :  多种 try.......except.....

python解释器检测到错误,触发异常(也允许程序员自己触发异常
程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)
如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理
try:
l1 = [1,2,3]
l1[100] # list index out of range
except Exception as e:
print(e)
print(111) # 程序即使有错误也不影响后面文件的执行
print(222)
print(333)

单支 try  except

try:
l1 = [1,2,3]
l1[100] # IndexError # 程序发现错误,直接跳到except。然后执行后续代码
print(333)
print(5555)
except IndexError as e:
print(e)
print(777)

多支 try  except

try:
l1 = [1,2,3]
# l1[100] # IndexError
print(333)
print(5555)
dic = {'key1':'v1'}
dic['key2'] # KeyError
num = int(input('请输入选项:'))
print(777)
except IndexError as e:
print(e)
except KeyError as e:
print(e)
接收所有错误:try .except  EXCEPOTION
try:
l1 = [1,2,3]
# l1[100] # IndexError
print(333)
print(5555)
dic = {'key1':'v1'}
# dic['key2'] # KeyError
num = int(input('请输入选项:'))
print(777)
except Exception as e: # 接收所有错误
print(e)
# 以上这三种分情况讨论:
# 1,如果你对报错信息不关系,只是想直接跳过报错而不分流执行代码。 万能异常最好。
# 2,如果你想要捕捉具体的错误信息,根据不同的错误执行不同的分支。多分支比较好。
try expcet else  
出现异常不执行else语句,没有异常就执行else语句
try:
l1 = [1, 2, 3]
l1[100] # IndexError
except IndexError:
print(666)
else:
print('出现异常不执行else语句,没有异常就执行else语句')
try  except finally  有没有错误finally都会执行
用处: 关闭文件句柄,断开数据库连接
try:
l1 = [1, 2, 3]
# l1[100] # IndexError
dic = {}
dic['key1']
except IndexError:
print(666)
else:
print('出现异常不执行else语句,没有异常就执行else语句')
finally:
print('finally有没有异常都执行finally语句') finally有没有异常都执行finally语句,要他有何用?
1,关闭文件句柄,数据库链接等。
with open('log',encoding='utf-8') as f1:
try:
# f1.read() 好几千代码
finally:
f1.close()
# 函数,return  循环的break 之前执行finally操作。
def func():
try:
return 666
finally:
print(111) # 会执行
func()
while被break打断,finally也会执行
while 1:
try:
break
finally:
print(777)

raise 主动抛出错误

class MyError(BaseException): # 自定义一个错误
pass
try:
raise MyError('我的错误') # 主动跑出自定义错误
except MyError as e:
print(e)

assert 1 == 2

 

 



day 21 封装,多态,类的其他属性的更多相关文章

  1. 封装 多态 类的约束 super

    python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情况具体分 ...

  2. python之面向对象性封装,多态,以及鸭子类型

    默认类型 class A: class_name = 'python23期' def __init__(self, name, age): self.name = name self.age =age ...

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

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

  4. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  5. OOP面向对象 三大特征 继承封装多态

    OOP面向对象 ----三大特征 继承封装多态 面向对象(Object Oriented,OO)是软件开发方法.面向对象的概念和应用已超越了程序设计和软件开发,扩展到如数据库系统.交互式界面.应用结构 ...

  6. Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理)

    Python进阶(十六)----面向对象之~封装,多态,鸭子模型,super原理(单继承原理,多继承原理) 一丶封装 , 多态 封装:            将一些东西封装到一个地方,你还可以取出来( ...

  7. java 封装多态继承

    java 面向对象思想 封装多态继承 面向过程与面向对象 编程分为面向对象编程和面向对象编程,汇编,C语言是面向过程写代码,C++/Java是面向对象 其实面向过程和面向对象在本质都是一样写代码,然后 ...

  8. SpringMVC 自动封装枚举类的方法

    springmvc默认无法自动封装枚举类,解决方法如下: 1.枚举类 public enum GoodsPromoteEnum { /** * 0 精品 */ fine("精品", ...

  9. iOS NSURLSession 封装下载类

    周六日鼓捣NSURLSession,效率虽然低下,最后还是有了一点点眉目.昨天和汤老师一起测试,又对它加深了一点理解.趁热打铁,先总结一下. 封装的类,对外用的方法,我写的是类方法,所以,在类方法中, ...

  10. 封装application类

    <?php  //判断用户是否是通过入口文件访问   if(!defined('ACCESS')){     echo '非法请求';     die;   }   //封装初始化类   cla ...

随机推荐

  1. The Google File System 中文版

    摘要 我们设计并实现了Google文件系统,一个面向分布式数据密集型应用的.可伸缩的分布式文件系统.虽然运行在廉价的日用硬件设备上,但是它依然了提供容错功能,为大量客户机提供了很高的总体性能. 虽然与 ...

  2. 腾讯助理PHP开发工程师外包岗面经

    校招错过腾讯了,在社招上看到腾讯有招外包岗,要求比正式岗低,于是抱着试一试的心态投了简历,没一会就收到了笔试题,还算简单. 第二天收到面试官的面试邀请,然后去面试了…… 腾讯里面真是漂亮,光是看装潢就 ...

  3. Jenkins:管理节点

    Jenkins 管理节点 是管理所有即将在其上执行任务(JOB)的slave机器,包括各种OS类型的主机,都可以作为节点,因为Jenkins是java实现的,所以能安装JVM的OS都可以作为Jenki ...

  4. while read line

    # grep "请求报文:" application-20170822-*.log >> applog # cat applog|cut -d ":" ...

  5. 在CentOS7中利用yum命令安装mysql

    在CentOS7中利用yum命令安装mysql 原创 2016年08月31日 10:42:33 标签: mysql / centos 4832 一.说明 我们是在VMware虚拟机上安装的mysql, ...

  6. C# 简单的定时关机

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  7. git-04 同意分支合并

    https://blog.csdn.net/boysky0015/article/details/78185879/

  8. C++ 动态创建按钮及 按钮的消息响应

    动态创建的按钮 都会在消息 OnCommand 中得到处理,无论是什么消息,都会处理的 1\创建按钮 CButton* btn = new CButton(); btn->Create(_T(, ...

  9. [Android] Robotium手机自动化测试(仅需apk安装包版)——环境搭建 【转】

    Robotium的手机自动化测试,很多都是利用app源代码里的Id定义来开发自动化脚本.而在我开始要为项目中的app写自动化测试脚本的时 候,开发的环境还很不稳定,app也还处于开发的状态中,而且,在 ...

  10. python字典dict的成对运算

    dict = {'age': 18, 'name': 'jin', 'sex': 'male', }# for k,v in dict.items():# print(k,v)# v1 = dict[ ...