2017-08-17 8 views
0

私はPythonでいくつかのカスタムクラスを作成していますが、そのインスタンスをすべて継承することなくクラスに属性を定義する方法があるかどうかは疑問でした。例えばクラスの属性をインスタンスに設定しないでください

class Foo(): 
    def bar(): 
     pass 

Foo.bar # would return `bar` function 
instanceOfFoo = Foo() 
instanceOfFoo.bar # would raise an AttributeError 

私は、Fooをサブクラスbarをオーバーライドし、手動barが存在しないことを「外見」を与えること@propertyとしてAttributeErrorを上げることができる知っているが、どのような方法がありますサブクラスなしでこれを行うには?

コンテキスト:私は何かを行います(Dateクラス自体に)Date.parseを呼び出すJavaScriptの、からDateクラスを複製しようとしていますが、インスタンスは継承されませんのでDateインスタンス上parseを呼び出すと、何もしませんparseの機能はDateです。 (彼らはDate.prototypeからすべてのプロパティを継承しているので、そこで動作します)

+1

あなたはクラスメソッドhttps://docs.python.org/2/library/functions.html#classmethodまたは静的メソッドhttps://docs.python.org/2/libraryを持つようにしたいような音/functions.html#staticmethod –

+0

@Klaus D. Classmethodsはまだクラスのインスタンスによって継承されます。彼らはクラスのインスタンスではなく、最初の引数としてクラスを受け取ったばかりです。インスタンスがクラスの属性を継承しないようにする方法を探しています。 – ChristianFigueroa

+0

さて、あなたは継承してもいなくてもかまいません。一般に、ある言語を他の非常に異なる言語で模倣しようとするのは疑わしいことです。 –

答えて

2

メタクラスを使用して探していたものが見つかりました。

class MetaFoo(type): 
    def bar(self): 
     pass 

class Foo(metaclasses=MetaFoo): 
    pass 

Foo.bar # returns `bar` method 
instanceOfFoo = Foo() 
instanceOfFoo.bar # raises AttributeError 
Foo

MetaFooクラスを使用して作成され、その過程でbar方法を継承しています。継承のみクラスの直接のインスタンスで動作するので、FooMetaFooのインスタンス)barメソッドを継承するが、instanceOfFooFooなくMetaFooのインスタンス)メソッドを継承しません。

1

あなたの質問には回避策があります。 pythonにあることbar()@staticmethodまたは@classmethodと宣言されていない限り、Foo.bar()に電話をかけることはできません。

class Foo(object): 
    def __init__(self): 
     self.bar = self.foo 

    @classmethod 
    def bar(cls): 
     return 1 

    @classmethod 
    def foo(cls): 
     raise AttributeError("Method not implemented for instances of a class.") 

print(Foo.bar()) # --> 1 
t = Foo() 
print(t.bar()) # --> AttributeError: Method not implemented for instances of a class. 
関連する問題