什么是';Python';创建类属性的方法

什么是';Python';创建类属性的方法,python,Python,我是Python的初学者。我想知道创建属性的更好方法是什么 在第一个方法中,我显式定义属性,然后让一个方法返回一个值: class A: def __init__(self, number): self.a = self._meth( number) def _meth(self, num): #some executable code here return 8 ** num 在第二个变体中,方法本身被调用,并且自己创建属性

我是Python的初学者。我想知道创建属性的更好方法是什么

在第一个方法中,我显式定义属性,然后让一个方法返回一个值:

class A:
    def __init__(self, number):
        self.a = self._meth( number)

    def _meth(self, num):
        #some executable code here

        return 8 ** num
在第二个变体中,方法本身被调用,并且自己创建属性

class A:
    def __init__(self, number):
        self._meth(num)

    def _meth(self, num)
        #some executable code here
        self.a = 8 ** num
所以我的问题是,哪一种方式更容易被接受

这是我想用它来

class Initializer():
    def __init__(self):
        self.ParseArguments()
        self.InitializeLogger()

    # Parse command line arguments and display help text    
    def ParseArguments(self):
        help = textwrap.dedent('''\ Help text here''')
        Arguments = argparse.ArgumentParser('This Script Pulls NAV data from the '
                            'AMFI website', 
                            formatter_class=argparse.RawDescriptionHelpFormatter, 
                            description=help)
        Arguments.add_argument('-f', '--file',
                               help= 'location of the config')
        self.ArgumentDict = vars(Arguments.parse_args())
        self.ArgumentParser = Arguments




    def CreateLogFile(self, level, name,):
        path = self.ArgumentDict['loc']
        if path == None:
            if platform.system() == 'Windows':
                location = os.environ.get("TEMP") + '\\' + name
            elif platform.system == 'Linux':
                location = os.getenv("HOME") + '/' + name
            else:
                print "Unsupported OS"
                raise ValueError
        else:
            location = path
        formatter = logging.Formatter("%(asctime)s - %(name)s - "
                                      "%(levelname)s - %(message)s")
        logfile = logging.FileHandler(location)
        logfile.setLevel(logging.DEBUG)
        logfile.setFormatter(formatter)
        self.logger.addHandler(logfile)


    def InitializeLogger(self):
        self.logger = logging.getLogger('main')
        if self.ArgumentDict['debug'] == True:
            self.logger.setLevel(logging.DEBUG)
        else:
            self.logger.setLevel(logging.INFO)
        self.CreateLogFile(logging.INFO, 'NavUpdaterLog.log')) 

请注意,您正在创建对象属性,而不是类属性(这些属性直接位于类主体中)。如果仅在初始化时调用
meth
,我希望:

class A(object):
    def __init__():
         # Some executable code here
         self.a = 8
否则,如果你的类不能处理时不时被调用的
meth
,你应该通过在它前面加上
\u
\u
的前缀,使它成为一个私有方法

顺便说一下,方法末尾的
返回None
(使用大写的None)是不必要的,这是默认的最终指令

查看更新后的代码,我发现没有必要首先使用类。您可能希望有一个helper方法
initLogger
,但仅此而已。尝试:

  • 例如,使用内置功能,而不是自己重新实现
  • 大致遵循您的风格(即方法和变量名不大写)

在第二个定义中,只能使用该方法设置实例变量
a
。在第一个示例中,如果需要,可以再次使用该方法。另外,我不喜欢到处寻找实例变量,所以我会选择第一个。

我认为正确的python方法应该是用最简单的方法,删除所有不必要的代码

class A():
    def __init__(self):
        self.a = 8
如果需要定义自定义getter和setter,可以使用。这是python文档的摘录:

class C(object):
    def __init__(self):
        self._x = None

    @property
    def x(self):
        """I'm the 'x' property."""
        return self._x

    @x.setter
    def x(self, value):
        self._x = value

    @x.deleter
    def x(self):
        del self._x

我想答案是这要看情况而定。如果只有一个属性,如您的示例中所示,那么
meth
的整个主体都可以进入
\uuuu init\uuu
方法。如果要初始化5-10个属性,
\uuuu init\uuu
将变得很长,我肯定会尝试将初始化代码重构为函数。如果每个属性的初始化彼此独立,我将首先尝试使用函数

def get_attr_a():
    # some code
    return a
def get_attr_b():
    ...
    return b
...
class A:
    def __init__():
        self.a = get_attr_a()
        self.b = get_attr_b()
        ...
如果属性的初始化是相互依赖的,因此在完成a之前不能初始化b,那么情况就更复杂了。这可能保证某种工厂模式,其中对象的初始化与类分离:

class A:
    def__init__(self, a, b, c):
        self.a, self.b, self.c = a, b, c

def get_attr_a():
    return a
def get_attr_b(a):
    return b
def create_an_a_class():
    a = get_attr_a()
    b = get_attr_b(a)
    c = get_attr_c(a, b)
    ....
    return A(a, b, c)

使用init是(对于其他程序员)创建属性的一种可以理解的方法


通常,“init”是我开始阅读python类并浏览方法的方式。

return None
可以缩短为
return
,如果它只出现在函数/方法的末尾,您可以(也应该)忽略它。如果您不返回值,或者根本不返回,而是到达函数/方法的末尾,那么它的返回值是
None
。我的答案是,如果不知道您实际在做什么,就不可能说。您能否提供更多关于用例的信息,最好包括代码?(另请注意:对于Python2,请使用
类X(对象):
,新样式的类)我将添加更多信息,并按照前面的建议进行了更改。@Jodgod为什么在
\uu init_uuuz()
def\u meth()
中会遇到它?我想知道我是否忽略了Python中的某些内容,或者这是一个打字错误。