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))
原文地址:https://www.cnblogs.com/zjj1990/p/12917139.html