2017-06-27 6 views
1

私はすべてのAWSリージョンを含むPythonクラスを持っています。私はすべての地域のリストを返すクラスメソッドを書いた。私は下の例でやっているようにreturn文のすべての値をハードコードする必要はないので、すべてのクラス変数の値を返す良い方法はありますか?Pythonクラスからすべてのクラス変数値を返します

class AwsRegion(): 
    ''' 
    Class to define AWS Regions 
    ''' 
    OHIO = 'us-east-2' 
    NORTH_VIRGINIA = 'us-east-1' 
    NORTH_CALIFORNIA = 'us-west-1' 
    OREGON = 'us-west-2' 
    MUMBAI = 'ap-south-1' 
    SEOUL = 'ap-northeast-2' 
    SINGAPORE = 'ap-southeast-1' 
    SYDNEY = 'ap-southeast-2' 
    TOKYO = 'ap-northeast-1' 
    FRANKFURT = 'eu-central-1' 
    IRELAND = 'eu-west-1' 
    LONDON = 'eu-west-2' 
    SAO_PAULO = 'sa-east-1' 

    @classmethod 
    def all(cls,): 
     return [AwsRegion.OHIO, AwsRegion.NORTH_VIRGINIA, AwsRegion.NORTH_CALIFORNIA, AwsRegion.OREGON, \ 
      AwsRegion.MUMBAI, AwsRegion.SEOUL, AwsRegion.SINGAPORE, AwsRegion.SYDNEY, AwsRegion.TOKYO, \ 
      AwsRegion.FRANKFURT, AwsRegion.IRELAND, AwsRegion.LONDON, AwsRegion.SAO_PAULO] 
+0

'all'はクラス属性** too **です。あなたは呼び出し可能でないか、そうでなければ記述子ではないものを意味しますか? –

+0

これらの値を返すシンプルな方法は、リスト内でハードコーディングするよりも簡単です... –

答えて

2

この場合、大文字のクラスのすべての属性を列挙できます。あなたは、次の方法により、任意のクラスの属性を取得することができ、一般的な基準として、

>>> class AwsRegion(): 
...  ''' 
...  Class to define AWS Regions 
...  ''' 
...  OHIO = 'us-east-2' 
...  NORTH_VIRGINIA = 'us-east-1' 
...  NORTH_CALIFORNIA = 'us-west-1' 
...  OREGON = 'us-west-2' 
...  MUMBAI = 'ap-south-1' 
...  SEOUL = 'ap-northeast-2' 
...  SINGAPORE = 'ap-southeast-1' 
...  SYDNEY = 'ap-southeast-2' 
...  TOKYO = 'ap-northeast-1' 
...  FRANKFURT = 'eu-central-1' 
...  IRELAND = 'eu-west-1' 
...  LONDON = 'eu-west-2' 
...  SAO_PAULO = 'sa-east-1' 
...  @classmethod 
...  def all(cls): 
...   return [value for name, value in vars(cls).items() if name.isupper()] 
... 
>>> AwsRegion.all() 
['us-east-2', 'us-east-1', 'us-west-1', 'us-west-2', 'ap-south-1', 'ap-northeast-2', 'ap-southeast-1', 'ap-southeast-2', 'ap-northeast-1', 'eu-central-1', 'eu-west-1', 'eu-west-2', 'sa-east-1'] 
3

@classmethod 
def all(cls): 
    return [value for name, value in vars(cls).items() if name.isupper()] 

デモ:私はクラスの名前空間にアクセスするためにvars() functionを使用すると思います。ニーズに応じて選択してください:

__dict__を:

はすべて書き込み可能クラス属性の辞書を返します。これは通常必要なものです。

myObj = MyClass() 
attributes = myObj.__dict__ 

vars()

__dict__と同じ結果が、代わりにこれを使用することがベストプラクティスと考えています。

myObj = MyClass() 
attributes = dir(myObj) 

dir()

はあなたによって作られていないが、objectから継承されたものも含め、すべてのクラス属性を、返します。あなたのケースでは

myObj = MyClass() 
attributes = dir(myObj) 

vars()を使用すると、彼のanswerにマルタインピータースによって実証されるように、うまく動作します。

+0

vars()に言及しましたが、この行にdir(myObj)とタイプしました:vars = dir(myObj)。それはタイプミスですか? –

1

偶然、Enumタイプを作成している可能性があります。

AwsRegionクラスは、これらの値を保存するためにのみ使用されます(他の複雑な動作はほとんどありません)。Enumのサブクラスにしてみてください。これは、あなた自身ですべてを再作成することなく、素敵なメソッドをいくつか提供し、列挙型が何であるかを知っている他の人にコードを明確にします。

from enum import Enum 

class AwsRegion2(Enum): 
    OHIO = 'us-east-2' 
    NORTH_VIRGINIA = 'us-east-1' 
    NORTH_CALIFORNIA = 'us-west-1' 
    OREGON = 'us-west-2' 
    MUMBAI = 'ap-south-1' 
    SEOUL = 'ap-northeast-2' 
    SINGAPORE = 'ap-southeast-1' 
    SYDNEY = 'ap-southeast-2' 
    TOKYO = 'ap-northeast-1' 
    FRANKFURT = 'eu-central-1' 
    IRELAND = 'eu-west-1' 
    LONDON = 'eu-west-2' 
    SAO_PAULO = 'sa-east-1' 


print(list(AwsRegion2)) 
関連する問題