day 21 封装,多态,类的约束,私有成员,类方法,静态方法,类的属性,异常处理

封装:

将一些数据,重要的信息等等放到一个地方(空间)。

class A:
    country = 'China'
    area = '深圳‘
    def __init__(self,name,age):
        self.name = name
        self.age = age


a1 = A('狗子',18)        实例化一个对象  将
a2 = A('臭屁',20)
print(a1.__dict__)      #{'name': '狗子', 'age': 18}
print(a2.__dict__)      #{'name': '臭屁', 'age': 20}
面向对象封装

多态:

一种事物有多种形态

水:液态,固态,气态

python默认支持多态

i = 777

i = ‘abc’

鸭子类型

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

类的约束:

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

# 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):  
#     def pay(self,money):
#         print('此次消费%s' % money)
#
# class Unitypay(A):      
#     def zhifu(self,money):      # 太low了,正规化
#         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)
View Code

遇到这情况就要强制加一个约束,只要不按照我的规则执行,就报错。

两种解决方式:

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):
#     def pay(self,money):
#         print('此次消费%s' % money)
#
# class Unitypay(A):  # 太low了,正规化
#     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)
第二种强制约束

类的私有成员:

“”“”“”“”“”“”“”““”“””’

类的结构:

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)
         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)
# 私有成员虽然在类外面或者派生类可以访问到,但是不要这么做。
私有属性

类的类方法

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

# 对象可否调用类方法?
# 通过对象也可以调用类方法,cls 接受的不是对象空间而是类空间。
# 类方法在哪里用?
# 对类中的属性方法直接操作,与对象无关,这样才会用到类方法。
# 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)
静态方法

类的属性:

# 体质指数(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)
# 属性:将一个方法伪装成属性,虽然在代码逻辑上没什么提高,
# 但是让其看起来更合理一些。
属性

异常处理:异常:

在程序中只要出现了这种异常,程序会立马停掉,体验感极差,

遇到类似于这种逻辑上的异常,要先捕捉异常,根据不同异常,进行不同处理。

解决异常的方式:

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

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,如果你想要捕捉具体的错误信息,根据不同的错误执行不同的分支。多分支比较好
# 4, 一般会采取多分支 + 万能异常的形式。
'''
        try:
            num = input('请输入你要办理的业务:').strip()
            num = int(num)
            menu_dict[num]()
        except ValueError:
            print('请输入数字')
        except KeyError:
            print('超出范围,请重新输入')
        except Exception :
            print("出现未知错误.....")
'''

finally  ***

# 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

猜你喜欢

转载自www.cnblogs.com/malimalihong95/p/10284587.html
今日推荐