我正在尝试找到一种从文件中导入变量(字典)的方法,该文件将在内部用作class,用作class variable。由于我不能在类内部使用 from myVarFile import * ,因此只能在模块级别使用,如何将它们作为类变量导入
例如
from myVarFile import *
class myClass():
#class variables here
#should be the data from imported files
print someImportedVariable
def __init__(self):
#init here
def someClassFunction(self):
#needs to access class variables
self.someImportedVariable
作为一个测试,我尝试为myVarFile中的所有变量分配“全局”,并在类内部添加全局变量名称,这在类级别有效。但是我根本无法使用任何方法,例如
class myClass():
#class variables here
#should be the data from imported files
global someImportedVariable
print someImportedVariable
#this works
def __init__(self):
#init here
def someClassFunction(self):
#needs to access class variables
self.someImportedVariable
#this does not
我想避免在每个类方法中全局声明所有变量,这似乎是错误的。
如果方法是从导入文件中全局声明的,方法是否继承类变量?
答案 0 :(得分:0)
您始终可以将 add 属性添加到类主体之外的类:
from module import *
class Bar:
pass
Bar.foo = foo
或者您可以不使用*
语法导入名称:
class Bar:
from module import foo
导入对象基本上是一种分配; import name
或from module import name
在当前名称空间中设置name
。
如果必须从另一个模块中获取所有名称,然后将它们放在一个类中,请考虑将该类放入该模块中。至少,您可以在模块中放置一个基类,该基类具有要用作属性的所有名称,新类可以继承它。
因此,在基本模块中:
class BaseName:
attribute1 = ...
attribute2 = ...
这只是您现在添加的一个缩进级别,然后在另一个模块中添加:
from base_module import BaseName
class DerivedClass(BaseName):
def method(self):
# do something with self.attribute1, self.attribute2, etc.
如果不是这样,请复制名称空间:
import module
class Bar:
pass
# from module import * takes the names listed in module.__all__, or if that's
# missing, all names in the namespace that do not start with an underscore
_mod_namespace = vars(module)
_names = _mod_namespace.get('__all__', (n for n in _mod_namespace if n[:1] != '_'))
for _name in _names:
setattr(Bar, _name, _mod_namespace[_name])
del _mod_namespace, _name, _names
演示:
>>> from string import ascii_letters
>>> class Foo:
... pass
...
>>> Foo.ascii_letters = ascii_letters
>>> Foo.ascii_letters
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> class Bar:
... from string import digits
...
>>> Bar.digits
'0123456789'
>>> import string
>>> string.__all__
['ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace', 'Formatter', 'Template']
>>> class Bar:
... pass
...
>>> before = set(dir(Bar))
>>> _mod_namespace = vars(string)
>>> _names = _mod_namespace.get('__all__', (n for n in _mod_namespace if n[:1] != '_'))
>>> for _name in _names:
... setattr(Bar, _name, _mod_namespace[_name])
...
>>> [name for name in dir(Bar) if name not in before]
['Formatter', 'Template', 'ascii_letters', 'ascii_lowercase', 'ascii_uppercase', 'capwords', 'digits', 'hexdigits', 'octdigits', 'printable', 'punctuation', 'whitespace']
>>> Bar.hexdigits
'0123456789abcdefABCDEF'
>>> Bar.punctuation
'!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~'
但是,如果您需要做的就是从方法中“读取”值,则可以引用全局变量,而不必拥有来创建此类对象类属性。 只需从此类名称中删除self.
前缀,您的代码就可以正常工作。
答案 1 :(得分:0)
最后,我使用了以下内容:
在myVarFile.py内
someDict = {some contents}
someVar = 'test'
在main.py内部
import myVarFile
class someClass ():
def someMethod ():
print myVarFile.someDict
因此,我完全不必使用类对象,只需在变量前面加上导入的模块名即可。这很干净,因为我可以调试变量来自哪个模块,并避免名称空间冲突(特别是如果我要导入多个数据模块的话)
答案 2 :(得分:-1)
当然!
如果您的文件 source.py 具有类似这样的类:
// Create the form that we will be sending
var formData = new FormData();
formData.append("productMedia", fileToUpload);
formData.append("uname", userName);
formData.append("pay", pay);
// Other elements you need to append.
$.ajax({
url: 'ajax/category.php',
data: formData,
// Tell jQuery not to process data or not to worry about content-type
// You *must* include these options in order to send MultipartFile objects
contentType: false,
processData: false,
method: 'POST',
type: 'POST'
}
和另一个文件 import_test.py ,您可以执行以下操作:
class Animals:
dogs = ['ralph', 'alex']
只需确保它们在同一目录级别即可,