Python中如何实时显示对象的type和属性?

小弟刚学 python , 在写代码时候, 经常需要实时知道某个 object 的 type 以及它的 attribute.
我现在的笨办法是加入 print type 和 print dir.
有没有更好的办法?
Python中如何实时显示对象的type和属性?

13 回复

PyCharm 。

要是没法提示也没办法,谁让 Python 是动态类型的…


# 实时显示对象类型和属性的几种方法

# 方法1:使用type()和dir()函数
class MyClass:
    def __init__(self):
        self.name = "test"
        self.value = 42

obj = MyClass()
print(f"类型: {type(obj)}")
print(f"属性: {dir(obj)}")

# 方法2:使用vars()获取实例属性字典
print(f"实例属性: {vars(obj)}")

# 方法3:自定义监控装饰器
def monitor_properties(cls):
    """装饰器:在每次属性访问时显示信息"""
    class WrappedClass(cls):
        def __getattribute__(self, name):
            value = super().__getattribute__(name)
            print(f"[监控] 访问属性: {name} = {value} (类型: {type(value).__name__})")
            return value
            
        def __setattr__(self, name, value):
            print(f"[监控] 设置属性: {name} = {value} (类型: {type(value).__name__})")
            super().__setattr__(name, value)
    
    return WrappedClass

@monitor_properties
class MonitoredClass:
    def __init__(self):
        self.x = 10
        self.data = [1, 2, 3]

print("\n--- 使用监控装饰器 ---")
mc = MonitoredClass()
mc.x = 20
_ = mc.data

# 方法4:使用__dict__和property
class DynamicDisplay:
    def __init__(self):
        self._x = 0
        self._y = "hello"
    
    @property
    def current_state(self):
        """返回当前所有属性和类型"""
        return {k: type(v).__name__ for k, v in self.__dict__.items()}
    
    def show(self):
        print(f"对象类型: {type(self).__name__}")
        print("当前属性:")
        for attr, value in self.__dict__.items():
            print(f"  {attr}: {value} ({type(value).__name__})")

print("\n--- 使用内置状态显示 ---")
dd = DynamicDisplay()
dd.show()
print(f"通过property获取: {dd.current_state}")

# 方法5:交互式调试时使用
"""
在交互环境(如IPython/Jupyter)中可以直接:
- obj? 或 obj?? 查看详细信息
- %whos 查看所有变量类型
- 使用调试器pdb设置断点查看
"""

# 方法6:重写__repr__方法
class Debuggable:
    def __init__(self, **kwargs):
        for k, v in kwargs.items():
            setattr(self, k, v)
    
    def __repr__(self):
        attrs = ', '.join(f"{k}={v!r}({type(v).__name__})" 
                         for k, v in self.__dict__.items())
        return f"{type(self).__name__}({attrs})"

print("\n--- 使用增强的__repr__ ---")
dbg = Debuggable(name="test", count=5, items=[1, 2])
print(dbg)  # 输出: Debuggable(name='test'(str), count=5(int), items=[1, 2](list))

简单总结:用type()看类型,vars()__dict__看属性,需要监控就用装饰器或property。

多写就好了, 写到后面你不用 type 和 dir 就知道这个类型有哪些属性 /方法了.

找对象不靠工具的亲,靠真诚^_^
容易#2 ,写多了就好了

开个 ipython,然后各种 help.

这就是动态类型语言开发起来不舒服的地方。

享受了便利 有些地方還是要还的

自己建立的东西是知道返回的类型,
但是调用第三方库的时候 返回的东西稀奇古怪, 一个 dict 潜入一个 dict ,然后再嵌入 method, list 等, 疯了。

当时就是被一个 1(str), 1(int)搞得没有 pycharm 就不写 python.

如果一开始就严格约定好规范, 写好注释,自己写点项目还是挺好的, 但是第三方库或者多人团队合作就容易出问题, 即使是 pycharm 也不能进行完美的分析提示, 如果你写 ruby 你会更凌乱.

是啊, 好想有一门如 python 简洁却是静态类型, 能进行编译时检查的语言.

用冗余换严谨,世界上的确没有鱼和熊掌都得的好事, java 十年内还是不型项目主流

julia 可以做到

回到顶部