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()
  • 相关阅读:
    动态调整iframe的高度
    Binary Tree Zigzag Level Order Traversal
    Leetcode Anagrams
    二叉树层次遍历串成单链表
    leetcode 4sum
    leetcode 二叉树系列
    编程之美2.3
    Decode Ways
    leetcode graycode
    leetcode editdistance
  • 原文地址:https://www.cnblogs.com/fansik/p/7718173.html
Copyright © 2011-2022 走看看