2016-08-25 5 views
-1

サービスをモデル化しようとしていて、問題が発生しています。私はクラスを入れ子に試してみましたが、私はまだ問題を抱えていますPythonでクラス内でクラスを作成する方法

>>> service = Service() 
>>> service.name = "Instance1" 
>>> service.name.color = "red" 
>>> service.name.color.enabled = True 

:私は何をしようとしていることは、私はコード内でこのような何かをしたいです。 これは完全に規約違反ですか?もしそうなら、私は再評価し、そうする別の方法を見つけるでしょう。

EDIT: 私は階層をコピーするためにクラスをネストするだけで、次のようなことをすることにしました。

class Service(object): 
_prefix = 'Service' 
def __init__(self): 
    self.name = Service.Name() 
class Name(object): 
    _prefix = 'Service' 
    def __init__(self): 
     self.color = Service.Name.Color() 
    class Color(object): 
     _prefix = 'Service' 
     def __init__(self, color="N/A"): 
      self.color = color 
+1

「service.name.color」に相当するものは何ですか? –

+1

"クラスを入れ子にしましたが、まだ問題があります。"どのような問題?おそらく、構成は入れ子にするよりも良い考えです。 – DeepSpace

+2

'service.name'が文字列の場合、' .color'の期待される意味/動作は何ですか? –

答えて

-1

ネストされたクラスではなく、コンポジションを確認する必要があります。

class Color: 
    def __init__(self, name): 
     self.name = name 

class Service: 
    def __init__(self, color_obj): 
     self.color_obj = color_obj 

service = Service(Color("yellow")) 
print(service.color_obj.name) 
>> "yellow" 
0

他のオブジェクトをクラスの属性の値として持つことは規約に反しません。

あなたの希望するクラスを宣言することができます - あなたの例では、これらはclass Colorとなり、ブール値の属性はenabledになります。

0

私は、たとえば、ネストされたクラスを避けるだろう:

class Color: 

    def __init__(self, name, enabled=False): 
     self.name = name 
     self.enabled = enabled 

    def __str__(self): 
     return self.name 


class Service: 

    def __init__(self, name): 
     self.name = name 
     self.palette = None 


class Palette: 

    def __init__(self): 
     self.colors = [] 

    def __str__(self): 
     return ' - '.join([str(c) for c in self.colors]) 


if __name__ == "__main__": 
    num_services = 8 
    num_colors = 256 
    offset = num_colors/num_services 

    palettes = [Palette() for i in range(num_services)] 
    services = [Service("Service" + str(i)) for i in range(num_services)] 
    colors = [Color("color" + str(i)) for i in range(num_colors)] 

    for i in range(num_services): 
     subcolors = colors[i * offset:(i + 1) * offset] 
     palettes[i].colors = subcolors 
     services[i].palette = palettes[i] 
     print "Palette {0} -> {1}\n".format(i, palettes[i]) 

私はあなたがネストされたインスタンスを意味している場合、このコンテキスト

0

に色を有効にする意味は何か分からないが、あなただけのPythonモジュール01、この文脈で

>>> class LR(object): 
... def __init__(self, L=None, R=None): 
...  self.left = L 
...  self.right = R 

>>> class Thing(object): 
... def __init__(self): 
...  self.tree2=LR(LR(1,2), LR(3,4)) 

>>> t = Thing() 
>>> t.tree2.left.right 
2 

を関連__init__コードでそれらを作成(またはその後)およびattrsを使用することができます。 (attrsは非常に素晴らしいです:https://attrs.readthedocs.io/en/stable/)。

DjangoのネストされたMetaクラスのようなかなり深い魔法を意味するならば、ソースコードが利用可能です。 (これはDjangoの使い方がはっきりしていますが、ネストされたMeta宣言の内容を理解しているとは言えません。

Class Person(models.Model) 
    name = models.CharField(max_length = 100) 
    ... # more field declarations 
    Class Meta: 
     unique_together = (("name", "birthdate"),) 
     .... # more Meta-declarations 
関連する問題