Python-我可以从另一个文件中导入变量作为类变量吗?

时间:2018-10-22 20:54:08

标签: python

我正在尝试找到一种从文件中导入变量(字典)的方法,该文件将在内部用作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

我想避免在每个类方法中全局声明所有变量,这似乎是错误的。

如果方法是从导入文件中全局声明的,方法是否继承类变量?

3 个答案:

答案 0 :(得分:0)

您始终可以将 add 属性添加到类主体之外的类:

from module import *

class Bar:
    pass

Bar.foo = foo

或者您可以不使用*语法导入名称:

class Bar:
    from module import foo

导入对象基本上是一种分配; import namefrom 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']

只需确保它们在同一目录级别即可,