zoukankan      html  css  js  c++  java
  • Python 学习笔记三

    面向对象高级编程

    使用__slots__

    因为python是一门动态语言,所以无法避免的会有给一个实例添加各种的属性或者方法的情况,python可以使用这个来限制实力的属性。

    class Student(object):
        __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称
    
    

    但是我觉得这样也不是很好,如果有很多属性的话岂不是都写一长串,而且如果有人忘写了,还是不可避免的出现之前那种说过的情况。总而言之,语言不会去限制你怎么写,一切靠自觉。

    @property

    看到这个的第一感觉就是类似Object-C里面的property;

    只需要在属性对应的get函数前面加上@property,则可以实现get方法;在set函数前面加上属性.setter,则可以实现set方法;

    多继承

    在类定义的时候,可以在括号里面加上多个类从而实现多继承;

    class Dog(Animal,Friend) //狗是一种动物也是一种朋友
    
    

    运算符重载

    运算符重载意味着在类方法中拦截内置的操作-当类的实例出现在内置操作中,python自然会调用你的方法,比如我们一直使用的__init__

    类可以重载所有Python表达式运算符,像是打印、函数调用、属性点号运算等内置运算

    常见运算符重载方法包括以下:

    枚举类

    像是在c++中的enum,使用方法如下:

    from enum import Enum
    
    Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))
    
    

    元类

    元类就是用来创建类的东西,包括:

    1. 拦截类的创建;
    2. 修改类;
    3. 返回修改后的类;

    个人觉得这是一个黑魔法,一般项目中应该不会用到,同时使用者要很小心,而且要很清楚自己在干嘛。

    type

    type函数除了可以帮我们获取对象的类型,还可以帮我们创建对象,其描述为:

    type(类名, 父类的元组(针对继承的情况,可以为空),包含属性的字典(名称和值))
    
    

    举个例子:

    # 我们可以这么做
    
    class MyClass(object):
        bar = True
        
    # 也可以这么做
    Foo = type('Foo', (), {'bar':True})
    
    

    上面两种方法达到的目的是一样的,都能够创建一个类,但正常情况下不建议这么使用;

    metaclass

    除了使用type可以动态的创建类意外,还可以使用metaclass

    class Foo(object):
    	__metaclass__ = dosomething
    
    

    如果这么做的话,python就不会使用内建的type来创建这个类,而是使用你自己定义的元类来创建,python会做这么一个操作:

    首先写下class Foo(object),但是类对象Foo还没有在内存中创建。Python会在类的定义中寻找__metaclass__属性,如果找到了,Python就会用它来创建类Foo,如果没有找到,就会用内建的type来创建这个类。

    例子:

    # 请记住,'type'实际上是一个类,就像'str'和'int'一样
    # 所以,你可以从type继承
    class UpperAttrMetaClass(type):
        # __new__ 是在__init__之前被调用的特殊方法
        # __new__是用来创建对象并返回之的方法
        # 而__init__只是用来将传入的参数初始化给对象
        # 你很少用到__new__,除非你希望能够控制对象的创建
        # 这里,创建的对象是类,我们希望能够自定义它,所以我们这里改写__new__
        # 如果你希望的话,你也可以在__init__中做些事情
        # 还有一些高级的用法会涉及到改写__call__特殊方法,但是我们这里不用
        def __new__(upperattr_metaclass, future_class_name, future_class_parents, future_class_attr):
            attrs = ((name, value) for name, value in future_class_attr.items() if not name.startswith('__'))
            uppercase_attr = dict((name.upper(), value) for name, value in attrs)
            return super(UpperAttrMetaClass, upperattr_metaclass).__new__(upperattr_metaclass, future_class_name, future_class_parents, uppercase_attr)
    
    
    class Foo(object):
        bar = "happy"
    
        def echo_bar(self):
            print(self.bar)
    
    myclass = UpperAttrMetaClass('FooChild', (Foo,), {})
    
    my = myclass()
    my.echo_bar()  #输出happy
    
    

    错误、调试和测试

    错误处理

    类似于c++中的try...catch,python也有类似的错误处理函数:

    try...
    except: division by zero
    finally...
    

    例子:

    try:
        print('try...')
        r = 10 / int('a')
        print('result:', r)
    except ValueError as e:
        print('ValueError:', e)
    except ZeroDivisionError as e:
        print('ZeroDivisionError:', e)
    finally:
        print('finally...')
    print('END')
    
    

    你还可以使用内置的logging来纪录错误信息:

    import logging
    def main():
        try:
            bar('0')
        except Exception as e:
            logging.exception(e)
    
    

    总结

    到这里,我觉得最基本的语法已经学完了,接下来的包括:

    • IO编程
    • 异步编程
    • 进程和线程编程
    • 网络编程
    • 数据库编程

    这些编程都是用到的时候再来查询总结。

  • 相关阅读:
    SGU 176.Flow construction (有上下界的最大流)
    POJ 2391.Ombrophobic Bovines (最大流)
    poj 1087.A Plug for UNIX (最大流)
    poj 1273.PIG (最大流)
    POJ 2112.Optimal Milking (最大流)
    SGU 196.Matrix Multiplication
    SGU 195. New Year Bonus Grant
    关于multicycle path
    ppt做gif动图
    codeforces 598A Tricky Sum
  • 原文地址:https://www.cnblogs.com/George1994/p/6747001.html
Copyright © 2011-2022 走看看