我有点不确定如何在课堂外使用自我。 python中的很多内置方法都使用self作为参数,你不需要声明类;例如,您可以使用string.upper()
命令来大写每个字母,而无需告诉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。
答案 0 :(得分:5)
使用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")
答案 1 :(得分:2)
自我没有特殊意义 - 它只是一个变量名。它在类中的使用仅仅是传统的(因此在其他地方使用它可能会令人困惑)。
但是,您可以在事后设置类的属性,这些可以是类方法或实例方法(后者按照惯例使用“self”)。这不适用于像str
这样的内置类,虽然[编辑:所以你必须“诅咒”或子类,参见其他答案]
答案 2 :(得分: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'
答案 3 :(得分:2)
感觉就像你想要修补一个方法。如果是这样,那么欢迎来到年轻的黑暗面。让我们开始被诅咒的仪式。本质上你想要猴子补丁。我们所需要的只是一点点猴血。开玩笑。我们需要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'
在此之后,如果你不感到邪恶。然后你必须来到我邪恶的巢穴,在那里我将向你展示更多邪恶的技巧并分享 cookies 。
答案 4 :(得分:0)
在Python中,类方法的第一个参数是对象实例本身,按照惯例,它被称为self
。您应该阻止将self
用于其他目的。
更详细地解释一下:
如果你有一个班级
class A(object):
def __init__(self):
self.b = 1
你做了一个实例:
a = A()
这会调用 init 方法,如果填充了新对象,则调用self参数。然后调用self.b = 1
并将属性b
添加到新对象。然后该对象将被称为a
。
答案 5 :(得分:0)
&#34;自&#34;是函数的第一个参数的名称 - 就像任何参数一样,它在该函数之外没有任何意义。它对应的是调用该函数的对象。