Python就业班——初识面向对象

#!/usr/bin/env python3
# coding=utf-8
# Version:python3.6.1
# Project:practice
# File:Python就业班——初识面向对象.py
# Data:2020/7/10 16:15
# Author:LGSP_Harold


# 判断一个对象是否是一个已知的类型
# isinstance(obj, class)
# isinstance(22, int)
# 判断是否为子类
# issubclass(Cat, BaseCat)  True or False




# ————————————————————————————
# @property:将类的方法当做属性来使用
# class Cat(object):
#
#     def __init__(self, name, age):
#         self.name = name
#         self.__age = age
#
#     @property
#     def age(self):
#         return self.__age
#
#     @age.setter
#     def age(self, value):
#         if not isinstance(value, int):
#             print('年龄只能是整数')
#             return 0
#         if not 0 <= value <= 100:
#             print('年龄只能介于0-100之间')
#             return 0
#         self.__age = value
#
#     @property
#     def show_info(self):
#         return '我叫{0},今年{1}岁'.format(self.name, self.age)




# ————————————————————————————
# __slots__:为指定的类设置一个静态属性列表,为属性很少的类节约内存空间
# class Cat(object):
#     __slots__ = ('name', 'age')
#
#     def __init__(self, name, age):
#         self.name = name
#         self.age = age
#
#     @property
#     def show_info(self):
#         return '{0},{1}'.format(self.name, self.age)
#
#     def __str__(self):
#         return '我的对象:{0}'.format(self.name)
#
#
# def eat():
#     print('我吃鱼')
#
#
# class DuanCat(Cat):
#     """
#     蓝短猫
#     """
#     pass
#
#
# class PersianCat(Cat):
#     """
#     波斯猫
#     """
#     __slots__ = ('sex', 'eat', )
#     pass




# ————————————————————————————
# 类的静态方法和实例方法
# @staticmethod:表示静态方法
# @classmethod:类的方法

# class Cat(object):
#
#     tag = '猫科'
#
#     def __init__(self, name):
#         self.name = name
#
#     @staticmethod
#     def breath():
#         print('呼吸')
#
#     def show_info(self):
#         print('类的属性:{0},实例的属性:{1}'.format(self.tag, self.name))
#
#     # @classmethod
#     # def show_info1(cls):
#     #     # cls.name ==> Cat.name
#     #     print('类的属性:{0},实例的属性:{1}'.format(cls.tag, cls.name))
#
#     @classmethod
#     def show_info2(cls, name):
#         # cls.name ==> Cat.name
#         # print('类的属性:{0},实例的属性:{1}'.format(cls.tag, cls.name))
#         return cls(name)




# ————————————————————————————
# 装饰器
# 用来拓展原来函数功能的一种函数
# 返回函数的函数
# 在不用更改原函数的代码前提下给函数增加新的功能
# def log(func):
#     def wrapper():
#         print('start....')
#         func()
#         print('end....')
#     return wrapper
#
#
# @log
# def hello():
#     print('hello')

# 带参数的装饰器
# def log(name=None):
#     def decorator(func):
#         def wrapper():
#             print('{0}Start....'.format(name))
#             func()
#             print('{0}End....'.format(name))
#         return wrapper
#     return decorator
#
#
# @log()
# @log('you')
# def hello():
#     print('hello')
#
#
# def log(name=None):
#     def decorator(func):
#         def wrapper(*args, **kwargs):
#             print('{0}Start....'.format(name))
#             print(args)
#             print(kwargs)
#             rest = func(*args, **kwargs)
#             print('{0}End....'.format(name))
#             return rest
#         return wrapper
#     return decorator
#
#
# @log('from add')
# def add(a, b, *args, **kwargs):
#     return a + b


# def log(func):
#     def wrapper(*args, **kwargs):
#         rest = func(*args, **kwargs)
#         return rest
#     return wrapper
#
#
# @log
# def add(*args, **kwargs):
#     j = 0
#     for item in args:
#         j += item
#     return j



# # @wraps(func)用法
# def log(name=None):
#     def decorator(func):
#         @wraps(func)
#         def wrapper(a, b, *args, **kwargs):
#             """ 装饰器内部的函数 """
#             print('Start,{0}'.format(name))
#             print('{0}{1}'.format(func.__name__,func.__doc__))
#             num = func(a, b, *args, **kwargs)
#             print('End')
#             return num
#         print('{0}{1}'.format(func.__name__, func.__doc__))
#         return wrapper
#     return decorator
#
#
# @log('Leslie')
# def add(a, b, *args, **kwargs):
#     """ 加法计算 """
#     return a + b



# # 类的装饰器
# def func(self):
#     print('{0}我要吃东西【func()】'.format(self.name))
#
#
# def eat(cls):
#     """ 吃东西装饰器 """
#     cls.eat = lambda self: print('{0}我要吃东西【eat()】'.format(self.name))
#     cls.eat1 = func
#     return cls
#
#
# @eat
# class Dog(object):
#     """ 狗类 """
#     def __init__(self, name):
#         self.name = name




# ————————————————————————————
# 迭代器
# 1、迭代(iterate)意味着重复多次,就像循环那样(list,tuple)
# 2、实现了方法__iter__的对象是可迭代的,而实现了方法__next__的对象是迭代器
# 3、调用方法__next__时,(或next()),迭代器返回其下一个值
# 4、如果迭代器没有可供返回的值,触发StopIteration异常

# 从迭代器创建序列
# class PowNumber(object):
#     """
#     迭代器
#     生成1,2,3,....数的平方
#     """
#     value = 0
#     def __next__(self):
#         self.value += 1
#         if self.value > 20:
#             raise StopIteration
#         return self.value * self.value
#
#     def __iter__(self):
#         return self




# ————————————————————————————
# 生成器
# 生成器是一种使用普通函数语法定义的迭代器
# 包含yield语句的函数都被称为生成器
# 不使用return返回一个值,而是可以生成多个值,每次一个
# 每次使用yield生成一个值后,函数都将冻结,即在此停止执行
# 被重新唤醒后,函数将从停止的的地方开始继续执行
# def pow():
#     yield 1
#     yield 2
#     yield 3
#     yield 4
#     yield 5
#     yield 6
#
#
# def pow_number():
#     return (x * x for x in [1, 2, 3, 4, 5])
#
#
# def pow_number1():
#     for x in [1, 2, 3, 4, 5]:
#         yield x * x


# 模拟range函数
# # 迭代器
# class IterRange(object):
#
#     def __init__(self, start, end):
#         self.start = start - 1
#         self.end = end
#
#     def __next__(self):
#         self.start += 1
#         if self.start >= self.end:
#             raise StopIteration
#         return self.start
#
#     def __iter__(self):
#         return self
#
#
# # 生成器
# class GenRange(object):
#
#     def __init__(self, start, end):
#         self.start = start
#         self.end = end
#
#     def get_num(self):
#         while True:
#             if self.start >= self.end:
#                 break
#             yield self.start
#             self.start += 1
#
#
# def imitate_range(start, end):
#     while True:
#         if start >= end:
#             break
#         yield start
#         start += 1




# ————————————————————————————
# 异常捕获
# try:
#     pass
# except Exception as err:
#     print(err)
# finally:
#     pass


# 自定义异常
# class ApiException(Exception):
#     err_code = ''
#     err_msg = ''
#     def __init__(self, err_code=None, err_msg=None):
#         self.err_code = self.err_code if self.err_code else err_code
#         self.err_msg = self.err_msg if self.err_msg else err_msg
#     def __str__(self):
#         return 'Error{0}-{1}'.format(self.err_code, self.err_msg)
#
#
# class InvalidCtrlExec(ApiException):
#     err_code = '40001'
#     err_msg = '不合法调用凭证'
#
#
# class BadPramsException(ApiException):
#     err_code = '40002'
#     err_msg = '两个参数必须都是整数'
#
#
#
#
# def divide(num1, num2):
#     if not isinstance(num1, int) or not isinstance(num2, int):
#         raise BadPramsException()
#     if num2 == 0:
#         raise ApiException('40000', '除数不能为0')
#     return num1 / num2




# # 抛出异常及异常的传递
# class MyException(Exception):
#     pass
#
#
# def v_for():
#     """ 自定义函数 """
#     for i in range(1, 100):
#         if i == 20:
#             raise MyException
#         print(i)
#
#
# def call_v_for():
#     """ 调用v_for函数 """
#     print("开始调用")
#     v_for()
#     print("结束调用")
#
#
# def test_rasie():
#     print("测试函数")
#     try:
#         call_v_for()
#     except MyException:
#         print('____________________________')
#     print("测试完毕")




if __name__ == '__main__':
    # cat = Cat('XX', 10)
    # rest = cat.show_info
    # print(rest)
    # cat.age = 10
    # rest = cat.show_info
    # print(rest)




    # ————————————————————————————
    # cat_b = Cat('xx', 12)
    # rest = cat_b.show_info
    # print(rest)

    # # 给实例添加新的属性
    # cat_b.color = 'while'
    # print(cat_b.color)
    # # 给实例添加新的方法
    # cat_b.eat = eat
    # cat_b.eat()

    # 使用slots后不允许给实例添加新的属性
    # cat_b.color = 'black'
    # print(cat_b.color)
    # 使用slots后不允许给实例添加新的方法
    # cat_b.eat = eat
    # cat_b.eat()

    # # 使用__slots__要注意,__slots__定义的属性仅对当前类起作用,对继承的子类是不起作用的:(视频此处总结有误)
    # duan_cat = DuanCat('oo', 15)
    # rest = duan_cat.show_info
    # print(rest)
    # duan_cat.color = 'blue'
    # print(duan_cat.color)

    # # 在子类中也定义__slots__,这样,子类允许定义的属性就是自身的__slots__加上父类的__slots__。
    # persian_cat = PersianCat('hh', 0)
    # rest = persian_cat.show_info
    # print(rest)
    # persian_cat.sex = '母'
    # print(persian_cat.sex)
    # persian_cat.eat = eat
    # persian_cat.eat()
    # persian_cat.color = 'while'
    # print(persian_cat.color)




    # ————————————————————————————
    # # 通过类进行调用
    # Cat.breath()
    # cat = Cat('小黑')
    # # 通过类的实例化进行调用
    # cat.breath()
    # cat.show_info()
    # # cat.show_info1()

    # 此处视频内容不知是太难了还是讲师只是讲个大概(类方法),反正我没听懂,建议看文档自行理解。
    # 调用classmethod
    # cat2 = Cat.show_info2('oo')
    # cat2.show_info()




    # ————————————————————————————
    # hello()

    # hello()
    # rest = add(5, 6)
    # print(rest)

    # rest = add(5, 6)
    # print(rest)

    # rest = add(5, 6)
    # print('{0}{1}'.format(add.__name__, add.__doc__))
    # print(rest)


    # # 类的装饰器
    # dog = Dog('小黑')
    # dog.eat()
    # dog.eat1()




    # ————————————————————————————
    # 迭代器
    # pow = PowNumber()
    # print(pow.__next__())
    # print(pow.__next__())
    # print(next(pow))
    # print(next(pow))
    # for i in pow:
    #     print(i)




    # ————————————————————————————
    # 生成器
    # rest = pow()
    # print(next(rest))
    # print(next(rest))
    # print(next(rest))
    # print('__________________')
    # for i in rest:
    #     print(i)
    # print('__________________')
    # rest1 = pow_number1()
    # print(rest1.__next__())
    # print(next(rest1))




    # ————————————————————————————
    # 模拟range函数
    # iter = IterRange(5, 10)
    # print(list(iter))
    #
    # gen = GenRange(5, 10).get_num()
    # print(list(gen))
    #
    # imitate = imitate_range(5, 10)
    # print(list(imitate))




    # ————————————————————————————
    # 自定义异常
    # try:
    #     rest = divide(4, 0)
    #     # rest = divide(4, "00")
    #     print(rest)
    #
    # except ApiException as err:
    #     print('出错了')
    #     print(err)




    # test_rasie()


    pass

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章