Знаете ли вы, что вы можете получить тот же результат без if then else
?
См. Это:
fn_plotly<-function(fn_data,fn_x,fn_y){
p<-plotly::plot_ly(data = fn_data, x =~ fn_data[[fn_x]],type="scatter", color=fn_data[,fn_y])
return(p)
}
fn_plotly(iris,"Sepal.Length",NULL)
fn_plotly(iris,"Sepal.Length","Species")
Похоже, что он работает слишком хорошо: -)
Проблема в том, что назначение self .__ myvalue = ""
в __ init __
всегда будет сбивать значение myvalue
каждый раз, когда создается новый Borg. Вы можете увидеть это, если добавите некоторые дополнительные операторы печати в свой тест:
conf = Config()
conf.myvalue("Hello")
print conf.myvalue() # prints Hello
conf2 = Config()
print conf.myvalue() # prints nothing
print conf2.myvalue() # prints nothing
Удалите self .__ myvalue
и все будет хорошо.
Сказав это, реализация myvalue ( )
немного странно. Лучше, я бы сказал, иметь явные методы получения и установки с использованием свойств. Вам также потребуется некоторый код в __ init __
для инициализации значения myvalue
, если он еще не существует, или, по крайней мере, для обработки того, что он может не существовать в получателе. Возможно что-то вроде:
class Config(object):
"""
Borg singleton config object
"""
_we_are_one = {}
def __init__(self):
#implement the borg pattern (we are one)
self.__dict__ = self._we_are_one
def set_myvalue(self, val):
self._myvalue = val
def get_myvalue(self):
return getattr(self, '_myvalue', None)
myvalue = property(get_myvalue, set_myvalue)
c = Config()
print c.myvalue # prints None
c.myvalue = 5
print c.myvalue # prints 5
c2 = Config()
print c2.myvalue #prints 5
Объединение удаления self .__ myvalue = ""
с новым стилем Борг и предложения, которых следует избегать __
в именах переменных, мы получаем:
class Config(object):
"""
Borg singleton config object
"""
_we_are_one = {}
_myvalue = ""
def __new__(cls, *p, **k):
self = object.__new__(cls, *p, **k)
self.__dict__ = cls._we_are_one
return self
def myvalue(self, value=None):
if value:
self._myvalue = value
return self._myvalue
if __name__ == '__main__':
conf = Config()
conf.myvalue("Hello")
conf2 = Config()
print conf2.myvalue()
Проблема в том, что init () сбрасывает myvalue в пустую строку. Когда я удаляю эту строку, я получаю ожидаемый результат.