2017-12-07 7 views
0

それは私がOOPの基礎について混乱していても1は、Pythonでこれを実現する方法私には不明だ:Python OOP:フラグパラメータを使ってメソッドにアクセスする方法は?

だが、私はShapeクラスを作成し、例としてこれを使用するとしましょう。私の場合は

class Shape: 
    def __init__(self, x, y): 
     self.x = x 
     self.y = y 

    def area(self): 
     return self.x * self.y 

    def perimeter(self): 
     return 2 * self.x + 2 * self.y 

    def scaleSize(self,scale): 
     self.x = self.x * scale 
     self.y = self.y * scale 

、私は2種類のみ、file_typeAfile_typeBがあることにより、ファイルを入力クラスを作成する必要があります。ユーザーにとっては、Type AのクラスとType Bのクラスを使用するのは非常に面倒です。

## use case for an a "read in file name" class `filename` 
foo = filename(path = "path/to/file.txt", file_type = "TypeA") 

私の質問はどのように私はフラグfile_type="TypeA"で初期化ファイルの「タイプA」メソッドを制限し、フラグfile_type = "TypeB"で初期化されたファイルのための方法を制限するか、でしょうか?

もう一度Shapeクラスを試してみましょう。この2つのタイプはSquareTriangleです。どのように私はそれが、このようなタイプのShapeのために使用することはできませんarea方法==「タイプB」ことを作成しますか、そのようなクラスについては

class Shape: 
    def __init__(self, x, y, type): 
     self.x = x 
     self.y = y 
     self.type = type 

    if type == "Square": 

     def area(self): 
      return self.x * self.y 

     def perimeter(self): 
      return 2 * self.x + 2 * self.y 

     def scaleSize(self,scale): 
      self.x = self.x * scale 
      self.y = self.y * scale 

    elif type == "Triangle": 

     def hooray(self): 
      print("HOORAY! It's hip to be a triangle!") 

    else: 
     print("'type' must be either Circle or Triangle") 

## example Class instantiation 
bar = Shape(2, 3, type="Square") 

:これをコーディングする間違ったの方法は、このようなものでしょうか?私はあなたが母親のクラスを定義する必要があると思う

+0

なぜあなたのシェイプクラスを継承しないのですか?はい、あなたはより多くのOOPを覚える必要があります。ファクトリメソッドを使用して、適切なクラスをインスタンス化することもできます。 –

+0

_私の場合は、file'_typeA'と '_typeB'_という2つの型しか持たないファイルを入力するClassを作成する必要があります。ここで何を言おうとしていますか?特に**あなたが意味することを説明してください** – smac89

+0

あなたの形の例では 'class Square'と' class Triangle'を行い、正方形が必要なら 'Shape(type = 'square') 'ではなく' Square() 'です。 – deceze

答えて

3

class Shape: 
    pass 

、サブクラス

class Triangle(Shape): 
    # whatever methods there are 

あなたが記述しているものは、に応じて適切なオブジェクトを作成します工場機能ですいくつかのパラメータ:

def create(type): 
    if type=="Triangle": 
     return Triangle() 
    elif type=="Square": 
     return Square() 

しかし、呼び出し側ではなく、クラスの名前を通過しなければならないので、それは非常に便利ではありません。

c = create("Triangle") 

だけではなくやって:

c = Triangle() 

を保存/プログラムの状態を復元する際まあ、それはその関心を持っていること保存時にプログラムメモリ内のオブジェクトのタイプを含むテキストファイルから(pickleを使用しない場合)。

1

これはあなたの方法ではありません! OOPはに役立ちます。これらの条件を削除します。 Shape基本クラスを作成し、それを使用して個々の種類のシェイプのサブクラスを定義する必要があります。サブクラスには、そのような形状に必要なメソッドを含める必要があります。

ファイルやユーザーからのデータを使用しているなど、呼び出し元が文字列を使用して図形を指定できるようにするには、ファクトリメソッドを記述します。実際にPythonにあなたのクラスのサブクラスを尋ねることができます。それらをリストする必要はありません!DRY

class Shape(object): 
    __subs = {} 
    @classmethod 
    def of_type(cls, name, *args, **kwargs): 
     lname = name.lower() 
     subs = cls._Shape__subs 
     if cls is Shape: 
      if not subs:  # build subclass dictionary 
       subs.update({c.__name__.lower(): c for c in cls.__subclasses__()}) 
      if lname in subs: # instantiate the named subclass 
       return subs[lname](*args, **kwargs) 
      raise NameError("invalid shape name: %s" % name) 
     raise TypeError("of_type() may be called only on Shape base class") 

class Square(Shape): 
    pass 

class Triangle(Shape): 
    pass 

# set tri to an instance of type Triangle 
tri = Shape.of_type("Triangle") 

ファクトリメソッドは、名前の後に与えられた引数を通過することに注意してください。クラス名は大文字と小文字を区別しません。

+0

'of_type'とは何ですか? – mkrieger1

+0

'Shape.of_type(" Triangle ")'が 'Triangle'のインスタンスを返すことを正しく理解していますか? – mkrieger1

+0

試してみるとどうなりましたか? – kindall

関連する問題