zoukankan      html  css  js  c++  java
  • python 面向对象

    实例方法, 类方法, 静态方法, 动态方法伪装成属性

    class Dog:
    
        # 实例方法
        def eat(self): pass
    
        # 类方法, 主要用于操作类属性 增删改
        @classmethod
        def sleep(cls): pass
    
        # 静态发发, 和普通函数相似
        @staticmethod
        def func(): pass
    
        # 将一个方法伪装成属性 调用的时候不用加括号 ()
        @property
        def func1(self): pass
    
        # 设置func1值得时候自动调用这个方法
        '''
            obj = Dog()
            obj.func1 = 111   这个时候把111这个值传给 value
        '''
        @func1.setter
        def func1(self, value): pass
    
        '''
            obj = Dog()
            del obj.func1   这个时候自动调用
        '''
        @func1.deleter
        def func1(self): pass
    
        '''
            **************   这样的写法和上边一样   **************                                           
            def get_name(self):pass
            def set_name(self, value): pass
            def delete_name(self): pass
    name = property(get_name, set_name, delete_name)
    obj = Dog() obj.name obj.name = 111 del obj.name
    '''

    isinstance, issubclass区别

    class A: pass
    
    class B(A): pass
    
    class C(B): pass
    
    class D: pass
    
    obj = C()
    
    # isinstance(a, b) 判断a是否是b类或父类的 实例化对象
    print(isinstance(obj, C))    # True
    print(isinstance(obj, B))    # True
    print(isinstance(obj, A))   # True
    print(isinstance(obj, D))   # False
    
    # issubclass(a, b) 判断a类是否是b类的子孙类
    print(issubclass(C, B))  # True
    print(issubclass(B, A))  # True
    print(issubclass(C, A))  # True
    print(issubclass(D, A))  # False

    反射 hasattr, getattr, setattr, delattr

    实例对象反射

    class A:
        country = '中国'
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def func(self):
            print('执行func')
    
    obj = A('张三', 18)
    
    # 只要是对象.的方式能够调用的就是True
    print(hasattr(obj, 'name'))  # True
    print(hasattr(obj, 'age'))   # True
    print(hasattr(obj, 'func'))  # True
    print(hasattr(obj, 'sex'))   # False
    
    print(getattr(obj, 'name'))     # 张三
    f = getattr(obj, 'func')
    f()      # 执行func
    # print(getattr(obj, 'sex'))  # 报错,因为没有sex , 可以设置默认值, 第三个参数
    print(getattr(obj, 'sex', ''))  #
    
    if hasattr(obj, 'name'):
        getattr(obj, 'name')
    
    # 设置
    setattr(obj, 'sex', '')

    类的反射

    class A:
        country = '中国'
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def func(self):
            print('执行func')
    
    
    if hasattr(A, 'country'):
        print(getattr(A, 'country'))   # 中国
    
    if hasattr(A, 'func'):
        # getattr(A, 'func')()   # 报错, 因为没有给self传参
        obj = A('张三', 18)
        getattr(A, 'func')(obj)     # 执行func

    其他模块反射

    创建一个reflex名字的py文件, 内容如下

    name = '张三'
    
    def func():
        print('reflex的func函数')
    
    class A:
        country = '中国'
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def func(self):
            print('执行A类func')

    本py文件内容

    import reflex
    print(getattr(reflex, 'name'))    # 张三
    getattr(reflex, 'func')()         # reflex的func函数
    
    obj = getattr(reflex, 'A')('李四', 20)
    print(obj.country)          # 中国
    obj.func()                  # 执行A类func
    print(hasattr(obj, 'name'))  # True

    本模块反射

    import sys
    
    class A:
        country = '中国'
    
        def __init__(self, name, age):
            self.name = name
            self.age = age
    
        def func(self):
            print('执行func')
    
    obj = A('张三', 18)
    print(hasattr(sys.modules[__name__], 'A'))
    print(hasattr(sys.modules[__name__], 'obj'))

    简单的单例

    class A:
    
        __dan = None
    
        def __new__(cls, *args, **kwargs):
            if cls.__dan is None:
                cls.__dan = object.__new__(cls)
            return cls.__dan
    
        def __init__(self, name):
            self.name = name
            print('触发init')
    
    a = A('123')
    b = A('222')
    print(id(a), id(b))
  • 相关阅读:
    队列数据结构与算法JavaScript描述(5)
    栈数据结构与算法Javascript描述(4)
    散列数据结构与算法JavaScript描述(8)
    Evevt Loop、任务队列、定时器等
    OSGi初始篇
    应用服务平台与应用服务器
    数据源相关规范整理
    新手入门:教您最优的J2EE学习经验和流程
    TableView的使用
    Strategy
  • 原文地址:https://www.cnblogs.com/zjj1990/p/12917139.html
Copyright © 2011-2022 走看看