1

注:どのように行うかを尋ねる前に、各プロパティ/記述子/クラス/メソッドが何をしたいのかをより明確に理解する必要があることがわかりました! 現時点では、私の質問には答えられないと思います。私を助けてくれてありがとう。

icktoofay と BrenBarn のおかげで、ディスクリプタとプロパティを理解し始めましたが、今は少し難しい質問があります。

これらがどのように機能するかがわかりました:

class Blub(object):
    def __get__(self, instance, owner):
        print('Blub gets ' + instance._blub)
        return instance._blub

    def __set__(self, instance, value):
        print('Blub becomes ' + value)
        instance._blub = value

class Quish(object):
    blub = Blub()

    def __init__(self, value):
        self.blub = value

そして、 a = Quish('one') がどのように機能するか (「ブラブが 1 つになる」を生成します) が、次のコードを見てみましょう。

import os
import glob

class Index(object):
    def __init__(self, dir=os.getcwd()):
        self.name = dir    #index name is directory of indexes
        # index is the list of indexes
        self.index = glob.glob(os.path.join(self.name, 'BatchStarted*'))
        # which is the pointer to the index (index[which] == BatchStarted_12312013_115959.txt)
        self.which = 0
        # self.file = self.File(self.index[self.which])
    def get(self):
        return self.index[self.which]
    def next(self):
        self.which += 1
        if self.which < len(self.index):
            return self.get()
        else:
            # loop back to the first
            self.which = 0
            return None
    def back(self):
        if self.which > 0:
            self.which -= 1
        return self.get()

class File(object):
    def __init__(self, file):
        # if the file exists, we'll use it.
        if os.path.isfile(file):
            self.name = file
        # otherwise, our name is none and we return.
        else:
            self.name = None
            return None
        # 'file' attribute is the actual file object
        self.file = open(self.name, 'r')
        self.line = Lines(self.file)

class Lines(object):
    # pass through the actual file object (not filename)
    def __init__(self, file):
        self.file = file
        # line is the list if this file's lines
        self.line = self.file.readlines()
        self.which = 0
        self.extension = Extension(self.line[self.which])
    def __get__(self):
        return self.line[self.which]
    def __set__(self, value):
        self.which = value
    def next(self):
        self.which += 1
        return self.__get__()
    def back(self):
        self.which -= 1
        return self.__get__()

class Extension(object):
    def __init__(self, lineStr):
        # check to make sure a string is passed
        if lineStr:
            self.lineStr = lineStr
            self.line = self.lineStr.split('|')
            self.pathStr = self.line[0]
            self.path = self.pathStr.split('\\')
            self.fileStr = self.path[-1]
            self.file = self.fileStr.split('.')
        else:
            self.lineStr = None                    
    def __get__(self):
        self.line = self.lineStr.split('|')
        self.pathStr = self.line[0]
        self.path = self.pathStr.split('\\')
        self.fileStr = self.path[-1]
        self.file = self.fileStr.split('.')
        return self.file[-1]
    def __set__(self, ext):
        self.file[-1] = ext
        self.fileStr = '.'.join(self.file)
        self.path[-1] = fileStr
        self.pathStr = '\\'.join(self.path)
        self.line[0] = self.pathStr
        self.lineStr = '|'.join(self.line)

まず、私はそれに取り組んでおり、中途半端なままにしていたので、ここにいくつかのタイプミスがあるかもしれません. それは私の主張ではありません。私のポイントは、icktoofay の例では、何も Blub() に渡されないということです。私がここでやっていることを行う方法はありますか? これは、プロパティに適していますか?

私はそれをしたいと思います:

>>> i = Index()         # i contains list of index files
>>> f = File(i.get())   # f is now one of those files
>>> f.line
'\\\\server\\share\\folder\\file0.txt|Name|Sean|Date|10-20-2000|Type|1'
>>> f.line.extension
'txt'
>>> f.line.extension = 'rtf'
>>> f.line
'\\\\server\\share\\folder\\file0.rtf|Name|Sean|Date|10-20-2000|Type|1'
4

1 に答える 1