iSEEer19 2022-01-14 14:36 采纳率: 33.3%
浏览 62
已结题

关于self.__class__.__name__的一些疑问

问题遇到的现象和发生背景

看廖神的orm不懂得地方

问题相关代码,请勿粘贴截图
class Field(object):
    def __init__(self,name,column_type):
        self.name=name
        self.column_type=column_type
    def __str__(self):
        print(self.__class__)
        return '<%s:%s>'%(self.__class__.__name__,self.name)

class StringField(Field):
    def __init__(self,name):
        print(self.__class__.__name__)
        super(StringField,self).__init__(name,'varchar(100)')

class IntegerField(Field):
    def __init__(self,name):
        super(IntegerField,self).__init__(name,'bigint')

#猜测  应该是有两种__name__ 一种是模块的 __name__==__main__  另一种是类属性 他的值应该就是类名
#猜测  难道一个类也被认为是一个模块?
#模块
print(__name__)
#类属性
t=StringField('cdl')
print(t.__class__)
#但是为什么 用hasattr 和 dir都找不到 这个 __name__
print(hasattr(t.__class__,__name__))
print(hasattr(StringField,__name__))
print(hasattr(t,__name__))
print(dir(t))
print(dir(StringField))
print(dir(t.__class__))

运行结果及报错内容

main
StringField
<class '__main__.StringField'>
False
False
False
['class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref', 'column_type', 'name']
['class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref']
['class', 'delattr', 'dict', 'dir', 'doc', 'eq', 'format', 'ge', 'getattribute', 'gt', 'hash', 'init', 'init_subclass', 'le', 'lt', 'module', 'ne', 'new', 'reduce', 'reduce_ex', 'repr', 'setattr', 'sizeof', 'str', 'subclasshook', 'weakref']

Process finished with exit code 0

我的解答思路和尝试过的方法

感觉如果__name__确实是类属性的话 那用hasattr 和 dir应该可以找到的吧 但是确实是没找到
但是self.class.__name__确实也没错

我想要达到的结果
  • 写回答

3条回答 默认 最新

  • 关注
    print(hasattr(t.__class__,'__name__')) 中'__name__'是字符串要加引号, 
    你不加引号__name__是变量名,获取的是当前的模块名'__main__', 
    就成了检查t.__class__对象中有没有'__main__'属性了
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月13日
  • 已采纳回答 2月5日
  • 创建了问题 1月14日

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置