码迷,mamicode.com
首页 > 编程语言 > 详细

Python面向对象之反射

时间:2018-08-31 19:24:18      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:命名   image   传递参数   stat   for   style   机制   ble   method   

一、补充:

@classmethod

整个方法中没有用到对象命名空间中的名字,且用到了类的命名空间中的名字(普通方法和属性property除外)

类方法的默认参数:cls 调用这个发方法的类

类方法的调用方式:通过类名调用

通过类名调用的本质是方法

 

@statimethod

将一个普通函数放到类中来就给这个函数加一个@staticmethod装饰器

这个函数就不需要传默认的参数:self,cls

静态方法的调用方式:通过类名调用

通过类名调用本质是函数

 

from types import MethodType,FunctionType    配合isinstance使用,判断是方法还是函数

通过类名调用,@classmethod的是方法,@statimethod的是函数

from types import FunctionType,MethodType
class Foo:
    @classmethod
    def func1(cls):pass

    @staticmethod
    def  func2():pass

print(Foo.func1-Function:,isinstance(Foo.func1,FunctionType))     # 判断类方法是否函数
print(Foo.func1-Method:,isinstance(Foo.func1,MethodType))         # 判断类方法是否方法
print(----------------------------------------)
print(Foo.func2-Function:,isinstance(Foo.func2,FunctionType))     # 判断静态方法是否函数
print(Foo.func2-Method:,isinstance(Foo.func2,MethodType))         # 判断静态方法是否方法

‘‘‘
Foo.func1-Function: False
Foo.func1-Method: True
----------------------------------------
Foo.func2-Function: True
Foo.func2-Method: False
‘‘‘

 

通过对象调用,@classmethod的是方法,@statimethod的是函数

from types import FunctionType,MethodType
class Foo:
    @classmethod
    def func1(cls):pass

    @staticmethod
    def  func2():pass

f = Foo()
print(Foo.func1-Function:,isinstance(f.func1,FunctionType))     # 判断对象类方法是否函数
print(Foo.func1-Method:,isinstance(f.func1,MethodType))         # 判断对象类方法是否方法
print(----------------------------------------)
print(Foo.func2-Function:,isinstance(f.func2,FunctionType))     # 判断对象静态方法是否函数
print(Foo.func2-Method:,isinstance(f.func2,MethodType))         # 判断对象静态方法是否方法

‘‘‘
Foo.func1-Function: False
Foo.func1-Method: True
----------------------------------------
Foo.func2-Function: True
Foo.func2-Method: False
‘‘‘

 

类可以被调用,对象不能被调用

def func(args):
    if callable(args):
        print(args())
    else:
        print(not callable:,args)

class Foo:pass

f = Foo()
func(Foo)           # 类     <__main__.Foo object at 0x0000016AE645C278>
func(f)             # 对象    not callable: <__main__.Foo object at 0x0000016AE645C320>

 

总结:

需要明确传递参数的是function(函数),不需要明确传递参数的是method(函数)。类直接调用是function(函数),类的实例调用的是method(函数)

类方法:类调用和对象调用都是method(函数)

静态方法:类调用和对象调用都是function(函数)

# 判断函数、方法、对象
from types import MethodType,FunctionType
def func(*args):
    function_count = 0
    method_count = 0
    foo_obj = 0

    for item in args:
        if isinstance(item,FunctionType):function_count += 1
        elif isinstance(item,MethodType):method_count += 1
        elif isinstance(item,Foo):foo_obj += 1

    return {function_count: function_count, method_count: method_count, foo_obj: foo_obj}

def func1():pass
class Foo:
    def method1(self):pass

f1 = Foo()
ret = func(func1,f1.method1,Foo.method1,Foo(),func,f1)
print(ret)

‘‘‘
{‘function_count‘: 3, ‘method_count‘: 1, ‘foo_obj‘: 2}
‘‘‘

 

类、对象内存机制的解析

技术分享图片

 

Python面向对象之反射

标签:命名   image   传递参数   stat   for   style   机制   ble   method   

原文地址:https://www.cnblogs.com/st-st/p/9567113.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!