2014-10-16 4 views
0

Я немного не уверен, как использовать self вне класса. Многие встроенные методы в python используют self как параметр, и вам не нужно объявлять класс; Например, вы можете использовать команду string.upper() для заглавной буквы каждой буквы без необходимости указывать python, какой класс использовать. В случае, если я не объясню себя хорошо, я включил то, что мой код выглядит ниже.Использование self в python, вне класса

def ispalendrome(self): return self == self[::-1] 

largestProd = 999**2 
largest5Palendromes = [] 
while len(largest5Palendromes) <= 5: 
    if str(largestProd).ispalendrome(): largest5Palendromes.append(largestProd) 
    largestProd -= 1 
print largest5Palendromes 

Примечание: Я понимаю, что существуют другие способы решения этой задачи, но я хотел бы знать, возможно ли это. TYVM.

+1

Вы хотите знать, можете ли вы добавить новый метод к типу 'str(). Ответ: нет, а не напрямую, вам придется подкласс. –

+0

Что конкретно проблема или не работает здесь? – mdurant

+2

@MartijnPieters хорошо он мог бы использовать https://github.com/clarete/forbiddenfruit ... но просто вы можете не означать, что вы должны –

ответ

4

использованием https://github.com/clarete/forbiddenfruit

from forbiddenfruit import curse 
def ispalendrome(self): #note that self is really just a variable name ... it doent have to be named self 
    return self == self[::-1] 
curse(str, "ispalendrome",ispalendrome) 

"hello".ispalendrome() 

к сведению, что только потому, что вы можете не означает, что его хорошая идея

в качестве альтернативы гораздо лучше, чтобы просто сделать

def ispalendrome(a_string): 
    return a_string == a_string[::-1] 

ispalendrome("hello") 
+2

О нет! Python каким-то образом превратился в Ruby! Мой мир в конце. , , :-( – mgilson

+1

Это называется «проклятие» по какой-то причине! – mdurant

+2

Должен ли я сделать это заявление об отказе выделенным жирным шрифтом?: P –

2

Само не имеет особый смысл - это просто имя переменной. Его использование в классах является обычным (так что это может сбивать с толку использовать его в другом месте).

Вы можете, однако, установить свойства класса после факта, и это могут быть методы класса или методы экземпляра (последний с «я» по соглашению). Это не будет работать с встроенными классами как str, хотя [править: так что вы должны были бы «проклятие» или подкласс, см другого ответа]

2

В

def ispalendrome(self) 

нет необходимости называть параметр self (действительно, это немного вводит в заблуждение), поскольку это не метод экземпляра. Я бы назвал это s (строка):

def is_palindrome(s): 

То, что вы можете иметь в виду, является использование связанных методов на классе, где:

an_instance = TheClass() 
an_instance.instance_method() # self is passed implicitly 

эквивалентно:

an_instance = TheClass() 
TheClass.instance_method(an_instance) # self is passed explicitly 

В данном конкретном случае, например:

>>> "foo".upper() 
'FOO' 
>>> str.upper("foo") 
'FOO' 
0

В Python первым аргументом метода класса является сам экземпляр объекта, по соглашению он называется self. Вы должны предотвратить использование self для других целей.

Чтобы объяснить это подробнее:

Если у вас есть класс

class A(object): 
    def __init__(self): 
     self.b = 1 

и вы сделаете его экземпляр:

a = A() 

это созывающий INIT метод и параметр self, если он заполнен свежим объектом.Затем вызывается self.b = 1 и добавляет атрибут b к новому объекту. Затем этот объект станет известен как a.

0

«Я» - это имя первого параметра функции - как и любой параметр, он не имеет значения вне этой функции. То, что ему соответствует, является объектом, на который вызывается эта функция.

1

Похоже, вы хотите, чтобы обезьяна наложила метод на это. Если да, тогда добро пожаловать в темную сторону молодой. Давайте начнем проклятый ритуал. По сути, вы хотите патч обезьяны. Все, что нам нужно, это немного обезьянья кровь. Просто шучу. Нам нужен type.MethodType. Но обратите внимание, что вы не можете обезьяны типа патч STDLIB:

>>> from types import MethodType 
>>> def palindrome(self): return self == self[::-1] 
... 
>>> str.palindrome = MethodType(palindrome, str) 
Traceback (most recent call last): 
    File "<input>", line 1, in <module> 
TypeError: can't set attributes of built-in/extension type 'str' 

Но это не остановит вас от вызывая хаос в других классах:

>>> class String(object): 
...  def __init__(self, done): 
...   self.done = done 
... 
... 
... 
>>> s = String("stanley yelnats") 
>>> def palindrome(self): return self.done[::-1] 
>>> s.palindrome = MethodType(palindrome, s) 
>>> s.palindrome() 
'stanley yelnats' 

Вы видите, как легко это было? Но мы только начинаем. Это всего лишь пример, позволяющий убить class, не так ли? Следующая часть заставит вас смеяться маниакально:

>>> from types import DynamicClassAttribute 
>>> class String(object): 
...  def __init__(self, done): 
...   self.done = done 
... 
... 
... 
>>> s = String("cheese") 
>>> def palindrome(self): return self.done[::-1]; 
... 
>>> String.palindrome = DynamicClassAttribute(palindrome) 
>>> s.palindrome 
'eseehc' 

После этого, если вы не чувствуете зла. Тогда вы должны подойти к моему злобному логову, где я покажу вам более злые трюки и поделиться печеньем.

Смежные вопросы