01 昨日内容回顾
类与类之间的关系:
依赖关系:将一个类的对象或者类名传到另一个类中。
关联关系
组合关系:将一个类的对象封装到另一个类的对象属性中。
聚合关系

boy gril
school teacher
多继承:
经典类:不继承object的类,只存在于python2x 深度优先
新式类:继承后object的类,存在python3x,python2x,c3算法。
mro() __mro__
02 作业讲解

03 面向对象的三大特性:封装,多态。
04 类的约束。
05 类的私有成员。
06 类的类方法,静态方法
07 类的属性
08 异常处理

# 03 封装,多态

# 封装:将一些数据,重要的信息等等放到一个地方(空间中)。# 面相对象:

# 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__)

# # 万能的.# print(a1.name)

# 多态# what:一种事物有多种形态。# 水:液态,固态,气态。# 变色龙:各种颜色各种变化。# 超人:带上眼睛就是记者,红内裤外穿就是超人,关上灯,就是男人。# python默认支持多态。

# int i = 7777# int i = 'abc'# 了解# python# class F1:#     pass

# class S1(F1):

#     def show(self):#         print('S1.show')

# class S2(F1):##     def show(self):#         print ('S2.show')

# obj = S1()# obj.show()

# def func(obj):#     obj.show()

# func(11)

# java# class F1:#     pass

# class S1(F1):##     def show(self):#         print('S1.show')

# class S2(F1):

#     def show(self):#         print('S2.show')

# def func(F1, obj):#     obj.show()

# 鸭子类型:看着像鸭子,你就鸭子。

# python 会约定俗称制定一些行为规范,保持一致性。

# class A:#     def func1(self):#         print('in A func1')##     def func2(self):#         print('in A func2')

# class B:#     def func1(self):#         print('in B func1')##     def func2(self):#         print('in B func2')

# str# bytes# 将 A,B里面相似的一些功能命名成相同的名字,隐约制定一个标准# obj1 = A()# obj1.func1()# obj2 = B()# obj2.func1()

# 源码;# str index# class Str_:#     def index(self):#         print('根据元素找索引')

# class List_:#     def index(self):#         print('根据元素找索引')

# class Tuple_:#     def index(self):#         print('根据元素找索引')

# 04 类的约束

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

# 第一版:新员工完成了,老大说了,你需要改进一下同一支付的功能。# class Alipay:

#     def pay(self,money):#         print('此次消费%s'% money)

# class QQpay:#     def pay(self,money):#         print('此次消费%s' % money)

# a = Alipay()# b = QQpay()

# a.pay(100)# b.pay(200)

#修改# class Alipay:

#     def pay(self,money):#         print('此次消费%s'% money)

# class QQpay:#     def pay(self,money):#         print('此次消费%s' % money)

# def pay(obj,money):  # 归一化设计#     obj.pay(money)

# a = Alipay()# a1 = Alipay()# b = QQpay()# pay(a,100)# pay(b,200)# pay(a1,300)

# 此时找来一个野生程序员,春哥,接替小潘的工作,添加一个微信支付功能吧。# class Alipay:

#     def pay(self,money):#         print('此次消费%s'% money)

# class QQpay:#     def pay(self,money):#         print('此次消费%s' % money)

# class Wechatpay:  # 太low了,正规化#     def fuqian(self,money):#         print('此次消费%s' % money)

# def pay(obj,money):  # 归一化设计#     obj.pay(money)

# a = Alipay()# a1 = Alipay()# b = QQpay()# pay(a,100)# pay(b,200)# pay(a1,300)# c = Wechatpay()# c.fuqian(300)

# 上面的没有约束力,不规范,制定一个标准,约束标准。# class A: # 这个父类制定了一个约束,规范,子类一定要有pay方法。#     def pay(self,money):#         pass

# class Alipay(A):

#     def pay(self,money):#         print('此次消费%s'% money)

# class QQpay(A):#     def pay(self,money):#         print('此次消费%s' % money)

# class Wechatpay(A):  # 太low了,正规化#     def pay(self,money):#         print('此次消费%s' % money)

# def pay(obj,money):  # 归一化设计#     obj.pay(money)

# a = Alipay()# a1 = Alipay()# b = QQpay()# c = Wechatpay()# pay(a,100)# pay(b,200)# pay(a1,300)# pay(c,400)

# 春哥会了,跟小潘去了一个组,接下来这个任务需要人接,找了一个其他培训机构,半野生。

# class A: # 这个父类制定了一个约束,规范,子类一定要有pay方法。#     def pay(self,money):#         pass

# class Alipay(A):

#     def pay(self,money):#         print('此次消费%s'% money)

# class QQpay(A):#     def pay(self,money):#         print('此次消费%s' % money)

# class Wechatpay(A):  # 太low了,正规化#     def pay(self,money):#         print('此次消费%s' % money)

# class Unitypay(A):#     def zhifu(self,money):#         print('此次消费%s' % money)

# def pay(obj,money):  # 归一化设计#     obj.pay(money)

# # a = Alipay()# # a1 = Alipay()# # b = QQpay()# # c = Wechatpay()# # pay(a,100)# # pay(b,200)# # pay(a1,300)# # pay(c,400)# d = Unitypay()# pay(d,200)# 此时全凭自觉不行了,咱们强制加一个约束,只要不按照我的规则执行,就报错。

# 两种解决方式:# 1,python常用的一种,在父类写一个相同的方法pay 在此方法里面,主动抛出一个错误,你应该在自己的类中定义此方法。# 用第一种是python经常用的解决方式。# class A: # 这个父类制定了一个约束,规范,子类一定要有pay方法。#     def pay(self,money):#         raise Exception('未定义pay方法')# class Alipay(A):

#     def pay(self,money):#         print('此次消费%s'% money)

# class QQpay(A):#     def pay(self,money):#         print('此次消费%s' % money)

# class Wechatpay(A):  # 太low了,正规化#     def pay(self,money):#         print('此次消费%s' % money)

# class Unitypay(A):#     def zhifu(self,money):#         print('此次消费%s' % money)

# def pay(obj,money):  # 归一化设计#     obj.pay(money)

# a = Alipay()# a1 = Alipay()# b = QQpay()# c = Wechatpay()# pay(a,100)# pay(b,200)# pay(a1,300)# pay(c,400)# d = Unitypay()# pay(d,200)  #出问题

# 解决方式2:在父类引用元类的抽象方法,抛出异常。

# from abc import ABCMeta,abstractmethod

# class A(metaclass=ABCMeta): # 这个父类制定了一个约束,规范,子类一定要有pay方法。    '''    抽象类,接口类:制定一个规范,强制执行。    '''#     @abstractmethod#     def pay(self,money):#         pass##     def func(self):#         pass# class Alipay(A):##     def pay(self,money):#         print('此次消费%s'% money)## class QQpay(A):#     def pay(self,money):#         print('此次消费%s' % money)

# class Wechatpay(A):  # 太low了,正规化#     def pay(self,money):#         print('此次消费%s' % money)## class Unitypay(A):#     # def zhifu(self,money):#     #     print('此次消费%s' % money)#     def pay(self,money):#         print('此次消费%s' % money)## def pay(obj,money):  # 归一化设计#     obj.pay(money)

# a = Alipay()# a1 = Alipay()# b = QQpay()# c = Wechatpay()# pay(a,100)# pay(b,200)# pay(a1,300)# pay(c,400)# d = Unitypay()# pay(d,200)

# 05 类的私有成员

'''类的结构:class A:

    静态属性

    方法'''# 按照公有,私有对 类进行划分。

# 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)

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

# 私有静态属性# 类外部访问,类内部访问,派生类访问# print(Boss.name)# print(Boss.__secretary) # 类外部不能访问

# b = Boss('alex123',123)# b.func()  # 类内部可以访问# b2 = Boss_son('smallalex','123')# b2.func()

# class Boss:

#     name = 'alex'  # 公有静态属性  公有静态字段#     __secretary =['女1', '男2', '眼膜']  # 私有静态属性  私有静态字段

#     def __init__(self,username,password):#         self.username = username  # 公有对象属性  公有普通字段#         self.__password = password  # 私有对象属性  私有普通字段

#     def func(self):#         # print(self.__secretary)#         self.__func()#     def __func(self):  # 私有方法#         print('经常跟秘书加班....')

# class Boss_son(Boss):#     def func(self):#         # print(self.__secretary)#         self.__func()# a1 = Boss('alex',666)# # a1.__func()  # 类外部不能访问# # a1.func() # 类内部可以访问# b1 = Boss_son('fdsa',123)# b1.func() # 类的派生类不能访问

# 私有成员当真访问不到么? 不是,python做了一些加工。# 私有属性# class Boss:

#     name = 'alex'  # 公有静态属性  公有静态字段#     __secretary =['女1', '男2', '眼膜']  # 私有静态属性  私有静态字段

#     def __init__(self,username,password):#         self.username = username  # 公有对象属性  公有普通字段#         self.__password = password  # 私有对象属性  私有普通字段

#     def func(self):#         # print(self.__secretary)#         self.__func()#     def __func(self):  # 私有方法#         print('经常跟秘书加班....')

# b1 = Boss('alex',123)# print(Boss.__dict__)# python 将我的私有成员  _类名__私有成员# print(Boss._Boss__secretary)# 私有成员虽然在类外面或者派生类可以访问到,但是不要这么做。
# 06 类的类方法,静态方法

# class A:#     name = 'barry'

#     def __init__(self,a,b):  # 双下方法#         self.a = a#         self.b = b

#     def __call__(self, *args, **kwargs):#         pass

#     def __str__(self):#         pass

#     def __new__(cls, *args, **kwargs):#         pass

#     def func(self):  # 普通方法,实例方法#         pass

#     @staticmethod  # 静态方法#     def func1():#         print(666)

#     @classmethod  # 类方法#     def func2(cls):#         print(777)

#     @property  # 属性#     def bim(self):#         print(111)

# 类方法# class A:#     name = 'barry'##     @classmethod  # 类方法#     def func2(cls):#         print(cls)#         print(777)##     def func1(self):#         print(self)

# a = A()# # print(a)# # a.func1()

# 类方法 他是通过类名直接调用的方法,类方法里面至少有一个参数,第一个参数默认cls# print(A)# A.func2()# 对象可否调用类方法?# 通过对象也可以调用类方法,cls 接受的不是对象空间而是类空间。# a = A()# a.func2()

# 类方法在哪里用?# 对类中的属性方法直接操作,与对象无关,这样才会用到类方法。# 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()#         return super(ClassTest, self).__new__(self)

# class Student(ClassTest):#     def __init__(self):#         self.name = ''

# a = Student()# b = Student()# print(ClassTest.getNum())

# 静态方法

# class A:

#     name = 'barry'

#     @staticmethod#     def func():#         print(666)# obj = A()# # A.func()# obj.func()

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

import time

# class TimeTest(object):#     def __init__(self, hour, minute, second):#         self.hour = hour#         self.minute = minute#         self.second = second

    # def time    # @staticmethod    # def showTime():    #     return time.strftime("%H:%M:%S", time.localtime())

# print(TimeTest.showTime())# t = TimeTest(2, 10, 10)# nowTime = t.showTime()# print(nowTime)
# 07 类的属性

# 属性

# 体质指数(BMI)=体重(kg)÷身高^2(m)

# 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('小胖',83,1.78)# barry = Bmi('太白',80,1.76)# # print(barry.bmi())# print(barry.bmi)# 属性:将一个方法伪装成属性,虽然在代码逻辑上没什么提高,# 但是让其看起来更合理一些。

# class A:

    # def __init__(self,username,password):    #     self.__username = username    #     self.__password = password

    # @property    # def name(self):    #     return self.__username

    # @name.setter    # def name(self,a):    #     if type(a) is str:    #         self.__username = a    #     else:    #         print('账号必须是字符串类型')

    # @name.deleter    # def name(self):    #     print(888)

# p1 = A('barry',123)# print(p1.__username)  # 这样访问不到

# print(p1.name)# p1.name# p1.name = '春哥'# print(p1.name)# # del p1.name# # p1 = A('barry',123)# # # p1.name = 111# # p1.name = '春哥'# # print(p1.name)

# class Market:#     def 商品名,商品价格,商品折扣

#     @property#     def price

#     @price.setter#     #通过传入的价格/折扣

# 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# print(apple.price)# del apple.price# print(apple.price)
# 08 异常处理

# 异常?报错#报错分为两个方面:#语法错误。# 1name = 'alex'# name1 = name2# if 3 > 2#     print(666)# 以上的这些语法错误,开发的时候一定要避免。

# 逻辑错误。# num = int(input('请输入选项:'))

# 异常:在程序中只要出现了这种异常,程序会立马停掉,体验感极差,# 遇到类似于这种逻辑上的异常,要先捕捉异常,根据不同异常,进行不同处理。

# 逻辑错误。# num = int(input('请输入选项:'))

# 异常:在程序中只要出现了这种异常,程序会立马停掉,体验感极差,# 遇到类似于这种逻辑上的异常,要先捕捉异常,根据不同异常,进行不同处理。

# num = int(input('请输入选项:'))  ValueError

# l1 = [1,2,3]# l1[100]  # IndexError# dic = {'key1':'v1'}# dic['key2']  # KeyError

# 解决异常的方式:# 1,利用if语句解决异常,只能处理简单少量的异常。

# num = input('请输入选项:')

# if num.isdigit():#     int(num)#     if#         if#             if

# else:#     pass

# 2,异常处理,try .....# python解释器检测到错误,触发异常(也允许程序员自己触发异常# 程序员编写特定的代码,专门用来捕捉这个异常(这段代码与程序逻辑无关,与异常处理有关)# 如果捕捉成功则进入另外一个处理分支,执行你为其定制的逻辑,使程序不会崩溃,这就是异常处理

# try .except 单支# try:#     l1 = [1,2,3]#     l1[100]  # IndexError#     print(333)#     print(5555)#     # dic = {'key1':'v1'}#     # dic['key2']  # KeyError#     print(777)# except IndexError as e:#     print(e)

# try .except  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:#             num = input('请输入你要办理的业务:').strip()#             num = int(num)#             menu_dict[num]()#         except ValueError:#             print('请输入数字')#         except KeyError:#             print('超出范围,请重新输入')#         except Exception :#             print("出现未知错误.....")

# 4, 一般会采取多分支 + 万能异常的形式。'''        try:            num = input('请输入你要办理的业务:').strip()            num = int(num)            menu_dict[num]()        except ValueError:            print('请输入数字')        except KeyError:            print('超出范围,请重新输入')        except Exception :            print("出现未知错误.....")'''

# try:#     l1 = [1,2,3]

#     # l1[100]  # IndexError

#     dic = {'key1':'v1'}#     # dic['key2']  # KeyError#     num = int(input('请输入选项:'))

# except IndexError as e:#     print(e)#     print(333)#     print(5555)# except KeyError as e:#     print(e)#     print(777)

# 剩余代码:# if 3 > 2:#     print(666)

# try expcet else

# try:#     l1 = [1, 2, 3]#     l1[100]  # IndexError# except IndexError:#     print(666)# print(111)# print(2)

# try:#     l1 = [1, 2, 3]#     # l1[100]  # IndexError# except IndexError:#     print(666)# else:#     print('出现异常不执行else语句,没有异常就执行else语句')

# try expcet else Fianlly

# 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 1:#     try:#         break#     finally:#         print(777)

# 主动抛出异常(用过)。# try:#     raise TypeError('类型错误')# except Exception as e:#     print(e)

# 很重要。

# class PhoneconnectionError(BaseException):#     pass## try:#     raise PhoneconnectionError('连接错误...')# except PhoneconnectionError as e:#     print(e)

# 条件不成立 主动报错# assert 1 == 2
												

day21_python_1124的更多相关文章

随机推荐

  1. Vue-Router路由 Vue-CLI脚手架和模块化开发 之 使用路由对象获取参数

    使用路由对象$route获取参数: 1.params: 参数获取:使用$route.params获取参数: 参数传递: URL传参:例 <route-linke to : "/food ...

  2. 全网搜歌神器Listen1 Mac中文版

    listen1 for mac中文版是mac上一款强大的全网搜歌音乐播放器,支持网易云音乐.QQ音乐.虾米音乐.酷狗音乐以及酷我音乐等网站的歌曲搜索播放功能,拥有创建歌单.随心播放.歌曲收藏.快速搜索 ...

  3. ReentrantLock源码

    ReentrantLock与Synchronized区别在于后者是JVM实现,前者是JDK实现,属于Java对象,使用的时候必须有明确的加锁(Lock)和解锁(Release)方法,否则可能会造成死锁 ...

  4. 软件测试2gkd

    JUnit单元测试 一.单元测试的概念和目的 什么是单元测试?单元测试是在开发过程中要进行的最低级别的测试活动,是需要与开发同步进行的工作,它由程序员自己完成,属于编码的一部分.单元测试是为了确保类的 ...

  5. 不错的anroid源码在线浏览网站【学习笔记】

    不错的anroid源码在线浏览网站:http://androidxref.com/

  6. pycharm的pip安装问题,需要确认适合IDE的pip版本

    python 报错     AttributeError: module 'importlib._bootstrap' has no attribute 'SourceFileLoader' 解决方法 ...

  7. Notepad++的Json格式化插件

    安装  :1.下载插件压缩包并解压出dll:Jsonviewer2.dll(64位)或NPPJSONViewer.dll(32位); 2..拷贝对应dll到Notepad++安装目录下的plugins ...

  8. DAY 21内存处理与正则

    一.python的垃圾回收机制 1.引用计数(垃圾回收机制的根本) 1.引用计数是用来记录值的内存地址被记录的次数的 2.每一次对值地址的引用都可以使该值的引用计数+1 3.每一次对值地址的释放都可以 ...

  9. dvi接口介绍

    Most graphics cards and motherboards feature a Digital Video Interface (DVI) connector for connectin ...

  10. 亚马逊(Review、Feedback)差评怎么处理?

    移除亚马逊Review差评,我看也就这三招靠谱点! 亚马逊特别重视review,差评会直接影响到listing的浏览量和销量,甚至还可以摧毁一个账号.遇到一个差的review怎么办?网上看到很多讲移除 ...