一、类方法与静态方法

class Person(object):

    #构造方法
    def __init__(self):
            pass
    #类方法
    @classmethod
    def fun1(cls): # cls 为当前类
        pass

    #静态方法
    @staticmethod # 对参数没有要求
    def fun2():
        pass

'''
    说明:
        1.静态方法和类方与普通函数的使用相同,若在子类重写则优先调用重写后的方法
        2.类方法与今天方法 既可以用对象调用也可以用类名调用,但是常用 类名调用
        3.常用工具类的封装
'''

二、重写

'''
    系统方法重写:
'''

class Person(object):

    def __init__(self,name,age):
        self.name = name
        self.age = age

    #系统方法重写
    def __str__(self):
        '''
        该方法必须有返回值,且返回值必须为字符串
        '''
        return "姓名:{},年龄:{}".format(self.name,self.age)

    __repr__ = __str__
'''
    关于__str__ 和 __repr__ 说明:
        1.二者都未被重写,打印对象调用的是__str__
        2.如果__str__重写,__repr__为被重写,打印对象调用的是__str__
        3.二者都被重写,打印对象调用的是__str__
        4.如果__str__ 未被重写,__repr__ 重写,打印对象调用的是__repr__
'''

'''
    普通成员方法的重写
'''
class Animal(object):
        #属性约束
       __slots__ = ("name","age")
       def __init__(self,name):
            self.name = name

        def show(self):
            pass

class SubAnimal(Animal):
        # 重写父类 show        
        def show(self):
            print("子类~~~show")
#重写 父类的方法后则 优先调用重写后的方法, 属性的约束 仅对当前类有效,其他类无效

三、重载

'''
    重载(overload) 与 重写(override) 区别:
         重写仅局限与对象的继承,当父类成员函数 不能满足子类需求时候,子类将对父类的成员函数进行重构 即重写 父类成员函数
        重载 包括重写 还有 全局函数的重构
'''

class Person(object):
    
    def __init__(self,age):
        self.age = age

    # 重载 __add__ 为全局函数
    def __add__(self,other):
        return Person(self.age + other.age)

    # 重写
    def __str__(self):
        return str(self.age)

    __repr__ = __str__

四、对象信息

# 1.type
num = 1
num1 = 2
print(type(num))
print(type(num1) == type(num)) # 类型的比较



# 2.函数类型 的对象判断
def fun():
    pass
import types
print(type(func) == types.FunctionType) # 是否为自定义def 函数
print(type(lambda x:x) == types.LambdaType) #是否为lambda 匿名函数
print(type(abs) == types.BuiltinFunctionType) # 是否为BIF内置函数
print(type((x for x in range(10))) == types.GeneratorType) # 是否为生成器

# 3.isinstance(testObj,obj)
print(isinstance(10,int))
print(isinstance([1,2,3],(list,tuple))) #等价于type([1,2,3]) in (list,tuple)
print(isinstance((1,2,3),(list,tuple)))


#4.dir() 获取一个对象的信息,返回一个列表
print(dir("hello"))
print(dir(int))

# 5.__name__ ,__dict__,__base__
'''
__name__: 通过类名访问,获取当前类的字符串
          不能通过对象访问,对象这样操作:对象.__class__.__name__
__dict__:返回一个字典
         通过类名访问,获取当前类的信息
         通过对象访问,获取对象信息
__bases__:返回一个元祖
        __base__ :拿到第一个父类
        通过类名访问,查看当前类 所有父类
'''