0

たとえば、次のような「文字列メソッド」:

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

「[シラバス]社会学 131 米国における AC 人種と民族性 (2012 年春) docx」

素晴らしいですし、私が書いているスクリプトにはたくさんのテキスト操作が含まれています。それは私がやっていることの多くであり、機能を追加するにつれて、それは引き続き重要です.

私が行っている一般的な操作の1つは次のとおりです。

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)

[シラバス] 社会学.131.AC.Race.and.Ethnicity.in.United.States (2012 年春) .docx

しかし、「.ftype()」、「.fname()」、「.fterm()」、および「.fext()」メソッド (私が持っているこれらの関数に対応する) を追加できるようにしたいと考えています。そして、私はそれを行う方法がわかりません。

スクリプト内のさまざまな関数で使用することを検討しています(したがって、クラスにバインドされることはありません)。

何をググるべきかさえ理解できません。しかし、どうすればこれらのメソッドを追加できますか?

PS メソッドの名前はそれほど重要ではありません。したがって、これらの名前を変更して、組み込みメソッドなどと競合しないようにする必要がある場合は、問題ありません。

編集:私は、このメソッドを次のようなものに使用できるようにしたいと考えています:

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

したがって、1 つの文字列などにバインドするのではなく、さまざまな文字列に使用できるようにしたいと考えています。

4

1 に答える 1

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、あなたの式はすでにそれを使用するように書かれているので、私はそれを使用しました。

于 2012-05-17T14:39:59.403 に答える