私はこのために予定が、ここで私が思いついた解決策になってしまうかもしれOK:メソッドは、インスタンスの属性が使用されているパラメータなしで呼び出されたときには、パラメータがONに設定されているのであれば
>>> class trythis:
... def __init__(self):
... self.firstvar=1
... self.secondvar=2
... self.thirdvar=3
... self.fourthvar=4
... def method1(self,firstvar=None,secondvar=None,thirdvar=None):
... kwargs=vars()
... for k, v in kwargs.iteritems():
... if k != 'self':
... if v:
... setattr(self, k, v)
... print("firstvar {}".format(self.firstvar))
... print("secondvar {}".format(self.secondvar))
... print("thirdvar {}".format(self.thirdvar))
... print("fourthvar {}".format(self.fourthvar))
...
>>> a=trythis()
>>> a.method1()
firstvar 1
secondvar 2
thirdvar 3
fourthvar 4
>>> a.method1(firstvar=9)
firstvar 9
secondvar 2
thirdvar 3
fourthvar 4
>>>
メソッドを呼び出し、インスタンス変数が、ここで上記に拡大
に上書きされますが、これを達成メタクラスである:
>>> from functools import wraps
>>> import inspect
>>>
>>> def setMethodAttrs(func):
... @wraps(func)
... def wrapper(*args, **kwargs):
... formalArgs=inspect.getargspec(func)[0]
... if len(args)>1:
... for x in range(1, len(args)):
... setattr(args[0], formalArgs[x], args[x])
... for k, v in kwargs.iteritems():
... setattr(vars()['args'][0], k, v)
... return func(*args, **kwargs)
... return wrapper
...
>>> def classAttrs(cls):
... for key, val in vars(cls).items():
... if callable(val):
... setattr(cls,key, setMethodAttrs(val))
... return cls
...
...
>>>
>>> @classAttrs
... class trythis:
... def __init__(self):
... self.firstvar=1
... self.secondvar=2
... self.thirdvar=3
... self.fourthvar=4
... def method1(self,firstvar=None,secondvar=None,thirdvar=None):
... print("firstvar {}".format(self.firstvar))
... print("secondvar {}".format(self.secondvar))
... print("thirdvar {}".format(self.thirdvar))
... print("fourthvar {}".format(self.fourthvar))
... def method2(self, secondvar=None, fourthvar=None):
... print("firstvar {}".format(self.firstvar))
... print("secondvar {}".format(self.secondvar))
... print("thirdvar {}".format(self.thirdvar))
... print("fourthvar {}".format(self.fourthvar))
...
...
...
>>> a=trythis()
>>> a.method1()
firstvar 1
secondvar 2
thirdvar 3
fourthvar 4
>>> a.method1(firstvar=9)
firstvar 9
secondvar 2
thirdvar 3
fourthvar 4
>>> a.method2(11)
firstvar 9
secondvar 11
thirdvar 3
fourthvar 4
>>> a.method1(19, thirdvar=21)
firstvar 19
secondvar 11
thirdvar 21
fourthvar 4
>>> a.method2(fourthvar=40)
firstvar 19
secondvar 11
thirdvar 21
fourthvar 40
>>>
だから、どんな方法が目に定義されていますe trythisクラスmethosが呼び出されたときにその引数がtrythisオブジェクトに自動的に設定され、これを行うコードがメタクラスに抽出されます
'** kwargs'を使用したくない場合は、反復する。 –
'None'のテストは' is'を使うべきです: 'repoName = self.repo if repoName is else else repoName'。 –
引数が偽(0、空文字列、空リストなど)にならない場合は、単に 'or':' repoName = repoName or self.repo'を使用してください。 –