什么是';Python';创建类属性的方法
我是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 在第二个变体中,方法本身被调用,并且自己创建属性
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中的某些内容,或者这是一个打字错误。