定义自定义String方法

时间:2012-05-17 14:36:18

标签: python string

“字符串方法”,例如:

teststring = "[Syllabus]Sociology.131.AC.Race.and.Ethnicity.in.the.United.States (Spring 2012).docx"
print teststring.replace('.', ' ')

“[Syllabus] Sociology 131 AC Race and Ethnicity in the United States(2012年春季)docx”

太棒了,我写的剧本涉及很多文本操作,这是我正在做的很多事情,而且我添加功能仍然很重要。

我正在做的一个常见操作是:

teststring = "[Syllabus]Sociology.131.AC.Race.and.Ethnicity.in.the.United.States (Spring 2012).docx"
def f_type(f): return f.split('/')[-1] if os.path.isdir(f) else re.split(r'(\[Syllabus\]|\[Syllabus \d+\]|\[Video\]|)(.*?)( \(Fall \d+\)| \(Spring \d+\)| \(Summer \d+\)|)(\.part\d+\.rar$|\.\w+$)', f.split('/')[-1])[1]
def f_name(f): return f.split('/')[-1] if os.path.isdir(f) else re.split(r'(\[Syllabus\]|\[Syllabus \d+\]|\[Video\]|)(.*?)( \(Fall \d+\)| \(Spring \d+\)| \(Summer \d+\)|)(\.part\d+\.rar$|\.\w+$)', f.split('/')[-1])[2]
def f_term(f): return f.split('/')[-1] if os.path.isdir(f) else re.split(r'(\[Syllabus\]|\[Syllabus \d+\]|\[Video\]|)(.*?)( \(Fall \d+\)| \(Spring \d+\)| \(Summer \d+\)|)(\.part\d+\.rar$|\.\w+$)', f.split('/')[-1])[3]
def f_ext(f): return f.split('/')[-1] if os.path.isdir(f) else re.split(r'(\[Syllabus\]|\[Syllabus \d+\]|\[Video\]|)(.*?)( \(Fall \d+\)| \(Spring \d+\)| \(Summer \d+\)|)(\.part\d+\.rar$|\.\w+$)', f.split('/')[-1])[4]
print f_type(teststring)
print f_name(teststring)
print f_term(teststring)
print f_ext(teststring)

[大纲] Sociology.131.AC.Race.and.Ethnicity.in.the.United.States  (2012年春季) .DOCX

但我希望能够添加:“。ftype()”,“。fname()”,“。afterm()”和“.fext()”方法(对应于我拥有的这些功能) )。我不知道该怎么做。

我希望在脚本中的一堆不同函数中使用它(因此它不会受到类绑定或任何其他)。

我甚至无法弄清楚我应该去做什么。但是我该如何添加这些方法?

P.S。这些方法的名称并不重要 - 所以如果我必须更改这些名称以避免与内置方法发生冲突或者没有问题。

编辑:我希望能够将此方法用于以下内容:

def testfunction(f1, f2): print 'y' if f1.ftype()==f2.ftype() else 'n'

所以我不希望它绑定到一个字符串或任何东西,我希望能够将它用于不同的字符串。

1 个答案:

答案 0 :(得分:4)

您无法向str等内置类型添加方法。

但是,您可以创建str的子类并添加所需的方法。作为奖励,添加@property,这样您就不需要调用方法来获取值。

class MyString(str):
    @property
    def f_type(f):
        return f.split('/')[-1] if os.path.isdir(f) else re.split(r'(\[Syllabus\]|\[Syllabus \d+\]|\[Video\]|)(.*?)( \(Fall \d+\)| \(Spring \d+\)| \(Summer \d+\)|)(\.part\d+\.rar$|\.\w+$)', f.split('/')[-1])[1]

s = MyString(teststring)
s.f_type

通常,您使用self作为方法参数列表中第一个参数的名称(接收方法所附加实例的引用的参数)。在这种情况下,我只使用了f,因为你的表达式已被编写为使用它。