zoukankan      html  css  js  c++  java
  • Python基础-面向对象2

    一、成员修饰符
    共有成员
    私有成员:创建方式在成员之前加两个下划线,私有成员无法直接访问,只能间接访问
    子类不能继承父类的私有属相
    私有普通字段的访问方式:
    class Fansik:
        def __init__(self, name, age):
            self.name = name
            self.__age = age
        def show(self):
            return self.__age
    obj = Fansik('fanjinbao', 12)
    print(obj.name)
    print(obj.show())
    私有静态字段的访问方式:
    class Fansik:
        __name = 'fanjinbao'
        @staticmethod
        def state():
            return Fansik.__name
    print(Fansik.state())
    或者
    class Fansik:
        __name = 'fanjinbao'
        def show(self):
            return Fansik.__name
    obj = Fansik()
    print(obj.show())
    私有方法的访问方式:
    class Fansik:
        def __state(self):
            return 123
        def show(self):
            return self.__state()
    obj = Fansik()
    print(obj.show())
    二、特殊成员
    __init__ 类()自动执行
    __call__ 对象() 类()()自动执行
    __int__ init(对象)
    __str__ str(对象)
    __dict__ 将对象中封装的所有内容通过字典的形式返回(包含注释)
    __add__ 两个对象相加时,自动执行第一个对象的__add__方法,并且将第二个对象当做参数传递进入
    __del__ 析构方法,对象销毁时自动执行
    __iter__
    class Fansik:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def __iter__(self):
            return iter([11, 22, 33])
    li = Fansik('fansik', 19)
    for i in li:
        print(i)
    如果类中有__iter__方法,那创建出来的对象-->就是可迭代对象
    可迭代对象.__iter__()的返回值,是一个迭代器
    for循环遇到的迭代器,使用next
    for循环遇到可迭代对象,通过对象.__iter__()获取迭代器,使用next
    执行li对象的类Fansik中的__iter__方法,并获取其返回值
    循环上一步中返回的对象
    class Fansik:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def __setitem__(self, key, value):
            print(key, value)
        def __getitem__(self, item):    # 切片(slice类型)或者是索引
            return item + 100
        def __delitem__(self, key):
            print(key)
    li = Fansik('fanjinbao', 19)
    li[100] = 'zhansan'
    print(li[100])
    del li[100]
    三、metaclass,原始类
    Python中一切事物都是对象
    class Fansik:
    pass
    obj = Fansik()
    obj是对象,Fansik类
    Fansik类是type的对象
    类都是type类的对象,type(...)
    "对象"都是以类的对象, 类()
    class Fansik:
        def func(self):
            print('123')
    或者使用下面的方法声明一个类
    def function(self):
        print('123')
    Fansik = type('Fansik', (object,), {'func': function})
    或者
    Fansik = type('Fansik', (object,), {'func': lambda x: 123})
    执行构造方法之前的需要执行的操作
    class MyType(type):
        def __init__(self, *args, **kwargs):
            print(123)
            pass
        def __call__(self, *args, **kwargs):
            print('456')
    
    class Fansik(object, metaclass=MyType):
        def __init__(self):
            pass
        def __new__(cls, *args, **kwargs):
            pass
        def func(self):
            print('hello world!!!')
    
    obj = Fansik()
    在obj被创建之前先执行MyType中的__call__方法,__call__中的self是Fansik
    obj是在__new__中被创建的
    四、异常处理
    try:
        name = input('please enter your name : ')
        i = int(name)
    except IndexError as e:
        print('IndexError')
    except ValueError as e:
        print('ValueError')
    except Exception as e:
        print('Exception')
    else:
        print('else')
    finally:
        print('finally')
    1、如果输入错误则执行ValueError、finally
    2、如果输入正确则执行else、finally

    自定义异常和主动触发异常
    # 自定义异常
    class Fansik(Exception):
        def __init__(self, msg):
            self.message = msg
        def __str__(self):
            return self.message
    try:
        # 主动触发异常
        raise Exception('fansik error...')
    except Exception as e:
        print(e)
    断言:如果条件成立,继续执行,如果条件不成立,直接抛异常
    用于强制用户服从,不服从就报错,可捕获,一般不捕获
    print(123)
    assert True
    print(456)

    五、反射
    foor内容:
    NAME = 'fanjinbao'
    def func():
        return 'func'
    def f1():
        return 'HOME'
    def f2():
        return 'NEWS'
    def f3():
        return 'CREAM'
    根据输入内容打印请求内容:
    import foor
    imp = input('please ent you choice: ')
    if hasattr(foor, imp):
        func = getattr(foor, imp)
        print(func())
    else:
        print('404')
    六、单例模式
    class Fansik:
        def __init__(self, name, age):
            self.name = name
            self.age = age
        def show(self):
            print(self.name, self.age)
    v = None
    if v:
        v.show()
    else:
        v = Fansik("fanjinbao", 19)
        v.show()
  • 相关阅读:
    1026 Table Tennis (30)
    1029 Median
    1025 PAT Ranking (25)
    1017 Queueing at Bank (25)
    1014 Waiting in Line (30)
    1057 Stack (30)
    1010 Radix (25)
    1008 Elevator (20)
    字母大小写转换
    Nmap的基础知识
  • 原文地址:https://www.cnblogs.com/fansik/p/7718173.html
Copyright © 2011-2022 走看看