我想避免调用很多isinstance()函数,所以我正在寻找一种方法来将实例变量的具体类名称作为字符串.
有任何想法吗?
我如何获得我目前所在班级的名称?
例:
def get_input(class_name):
[do things]
return class_name_result
class foo():
input = get_input([class name goes here])
Run Code Online (Sandbox Code Playgroud)
由于程序的性质,我正在与(vistrails)接口,我不能__init__()用来初始化input.
让我们考虑python(3.x)脚本:
main.py:
from test.team import team
from test.user import user
if __name__ == '__main__':
u = user()
t = team()
u.setTeam(t)
t.setLeader(u)
Run Code Online (Sandbox Code Playgroud)
测试/ user.py:
from test.team import team
class user:
def setTeam(self, t):
if issubclass(t, team.__class__):
self.team = t
Run Code Online (Sandbox Code Playgroud)
测试/ team.py:
from test.user import user
class team:
def setLeader(self, u):
if issubclass(u, user.__class__):
self.leader = u
Run Code Online (Sandbox Code Playgroud)
现在,当然,我已经获得了循环导入和出色的ImportError.
所以,不是pythonista,我有三个问题.首先:
一世.我怎么能让这个东西工作?
并且,知道某人将不可避免地说"循环导入总是表明设计问题",第二个问题来自:
II.为什么这个设计不好?
最后,第三个:
III.什么是更好的选择?
确切地说,上面的类型检查只是一个例子,还有一个基于类的索引层,它允许ie.发现所有用户都是一个团队的成员(用户类有许多子类,因此索引加倍,对于一般用户和每个特定子类)或所有团队都将用户作为成员
编辑:
我希望更详细的例子能够澄清我试图实现的目标.为了可读性省略了文件(但是有一个300kb的源文件让我感到害怕,所以请假设每个类都在不同的文件中)
# ENTITY
class Entity:
_id = None
_defs = {}
_data = None
def …Run Code Online (Sandbox Code Playgroud) type(obj)和之间有什么区别obj.__class__?有可能type(obj) is not obj.__class__吗?
我想编写一个在提供的对象上一般工作的函数,使用与另一个参数相同类型的默认值1.下面的#1或#2哪个变体会做正确的事情?
def f(a, b=None):
if b is None:
b = type(a)(1) # #1
b = a.__class__(1) # #2
Run Code Online (Sandbox Code Playgroud) 我遇到了一个python问题.我想用来type()找出我正在使用的变量类型.代码看起来与此类似:
class Foo():
array=[ myField(23),myField(42),myField("foo"), myField("bar")]
def returnArr(self):
for i in self.array:
print type(i)
if __name__ == "__main__":
a=Foo()
a.returnArr()
Run Code Online (Sandbox Code Playgroud)
编辑:myField()是我定义的类.
当我要求type()时,我得到: <type 'instance'>现在根据1,这是因为我使用了一个类元素并要求type()它.现在,我需要的是:<type 'int'>对于例如:myField(42)与<type 'str'>对myField(foo).我怎么能实现这一点?
编辑:
def __init__(self, name, default, fmt="H"):
self.name = name
if fmt[0] in "@=<>!":
self.fmt = fmt
else:
self.fmt = "!"+fmt
self.default = self.any2i(None,default)
self.sz = struct.calcsize(self.fmt)
self.owners = []
Run Code Online (Sandbox Code Playgroud)
代码取自scapy,我尝试调整它.
__qualname__python中有什么,它有什么用?
为什么我需要使用它__name__?
我阅读了文档,但它们并没有帮助我清楚地了解它的用处。
我已阅读获取 Python 类的完全限定名称 (Python 3.3+)。
这个问题问的是“如何获得一个合格的名字”,它假定人们知道“合格的名字”的含义。显然,该问题的答案是使用__qualname__属性。
我的问题是什么 __qualname__,为什么我应该在__name__.
我创建一个这样的命名元组:
from collections import namedtuple
spam = namedtuple('eggs', 'x, y, z')
ham = spam(1,2,3)
Run Code Online (Sandbox Code Playgroud)
然后我可以用例如火腿访问元素
>>> ham.x
1
>>> ham.z
3
Run Code Online (Sandbox Code Playgroud)
在翻译中,
>>> ham
eggs(x=1, y=2, z=3)
Run Code Online (Sandbox Code Playgroud)
但是,如果我只想得到"蛋"呢?我能想到的唯一方法是
>>> ham.__repr__.split('(')[0]
'eggs'
Run Code Online (Sandbox Code Playgroud)
但这似乎有点凌乱.这样做有更清洁的方法吗?
如果不使用私有方法无法访问它,为什么命名元组有这种"蛋"方面?
我有许多带有这样代码的类。每个都__init__启动一个线程和一个带有类名的记录器。如何在自己的定义中获取当前类的名称,作为字符串,在里面__init__?请注意,self可能不是当前类的实例,因此以下内容并非万无一失。
from threading import Thread
import logging
def myClassName(myclass):
myclass._class_name = myclass.__name__
return myclass
@myClassName
class SomeClass(object):
def __init__(self):
class_name = type(self)._class_name
print "My class name in __init__ is", class_name
self.thread = Thread(name=class_name)
self.logger = logging.getLogger(class_name)
Run Code Online (Sandbox Code Playgroud)
更新:
澄清:
我知道你不应该在程序中使用变量名,但我使用的是严格的调试目的,并希望将变量的名称传达给用户以提高可读性。
我有一个这样的文件:
class MyClass(object):
def __init__(self):
pass
def foo(msg=""):
debug("Called from the %s instance.") #quazi-print function that only prints when a DEBUG variable is True.
print(msg)
m = MyClass()
m.foo("Test")
Run Code Online (Sandbox Code Playgroud)
我想m从类本身中检索实例变量名称。虽然这只是一个示例文件,但我使用它向用户传达已在实例变量中的某个属性处创建了原始套接字,并希望显示它的位置(即New socket at m.socket)
这对 Python 可行吗?
我可能忽略了一些简单的事情.给定一个类的实例,我想得到类名.例如:
class Foooo: pass
instance = Foooo()
print("instance.__class__ = "+str(instance.__class__))
print("Just the class name: "+str(instance.__class__).split(".")[-1][:-2])
Run Code Online (Sandbox Code Playgroud)
这给出了以下输出:
instance.__class__ = <class '__main__.Foooo'>
Just the class name: Foooo
Run Code Online (Sandbox Code Playgroud)
有什么比这简单
str(instance.__class__).split(".")[-1][:-2]?
Run Code Online (Sandbox Code Playgroud)
如果有帮助的话,我在Python 3.2中
假设Foo是简单的情况
class Foo:
def some_func(self):
print('hellow world')
Run Code Online (Sandbox Code Playgroud)
我只能访问变量func,其中func是:
func = Foo.some_func
Run Code Online (Sandbox Code Playgroud)
我试图Foo从变量中获取类名func
func
Out[6]: <function __main__.Foo.some_func>
func.__class__.__name__
Out[7]: 'function'
Run Code Online (Sandbox Code Playgroud)
Foo 无论如何,我期待得到那样做?
如何从模型实例获取模型名称作为“字符串”。我知道您可以做类似的事情,type(model_instance)
但这将类本身作为对象<Model_Name: >而不是字符串返回。
python ×12
class ×4
class-design ×1
dependencies ×1
django ×1
instance ×1
methods ×1
models ×1
python-3.x ×1