2016-10-02 6 views
-1

クラス継承の変数をオーバーライドまたはオーバーロードする必要があります。ここに私が達成しようとしているものがあります:クラス継承の変数を同じ変数で正しくオーバーロードする方法

class MainClass: 
    def __init__(self, a, b, c, d): 
     type(a) = str 

class MyClass(MainClass): 
    def __init__(self, a, b, c, d): 
     type(a) = object of one of my classes. 

私はこれをどのようにしてPython 3で達成できますか?私は継承を見てきましたが、このような状況は議論されていないか、それを得られません。

+0

何?それは有効な構文でもありません!抽象的な例はあまりありませんか?あなたが達成しようとしていること、試したこと、失敗したことは全く書かれていません。 Pythonは動的に型定義されているので、 'a'とは異なる種類のものを渡すために必ずしもサブクラスを導入する必要はありません。 – jonrsharpe

+1

@jonrsharpe最初の例では、変数を文字列にキャストします。二番目に、彼はそれを何か他のものに作り直す。私はそれがかなり明確だと思う。 – Bharel

+1

@Bharelは私ではありません。彼らは、 'a'は最初のケースでは文字列、2番目のケースでは文字列でなければならないと言いますか?もしそうなら、それを伝える明確な方法として私には当てはまりません(少なくとも関数呼び出しに割り当てることはできません)。そして、なぜ彼らはPythonがどちらの気にしていると思いますか? – jonrsharpe

答えて

0

あなたがしようとしているように見えるのは、各クラスが他のクラスにアクセスできるようにすることです。しかし、これはクラス継承の仕組みではありません。お互いにアクセスするために、このクラスを使用してみてください。

class MainClass: 
    def __init__(self, a, b, c): # main class with variables, a, b and c. 
     self.a = a 
     self.b = b 
     self.c = c 

    def printall(self): # this will be so we can see what happens 
     print(self.a) 
     print(self.b) 
     print(self.c) 

class MyClass: 
    def __init__(self, class_inst, a): # another class of a class and a variable 
     self.a = a 
     self.class_inst = class_inst 

    def override(self): # this will override(or overload) the other class variable. 
     self.class_inst.a = self.a 

このようなテストコードを書きます。

class_inst_one = MainClass("Hello","World","!") 
class_inst_two = MyClass(class_inst_one, "Replacement") 
class_inst_one.printall() 
class_inst_two.override() 
class_inst_one.printall() 

このような出力が得られるはずです。

Hello 
World 
! 
Replacement 
World 
! 
+0

これは私がまだやりたいことではないと思うが、私はそれをテストするだろう。私はメインクラスの 'b'、 'c'、 'd'を継承したいが、私は新しいクラスで自分の 'a'を定義したい。それは紛らわしい。そして、いいえ、私はPython初心者ではありません。 – Godfrey

+0

次に、達成しようとしていることを明確にする必要があります。私ができることは、基本クラスと派生クラスのどちらを作成するかによって、変数に2つの異なる型を格納したいということです。 Pythonは動的言語なので、これは完全に合法です。コード内のその変数についての前提を作り、それが実際に別の型である場合には、その型の関数などを1つの型に対して呼び出そうとすると、あなたは落ちるだけです。また、動的コードで型チェックを行っている場合は、それがコードの匂いです。あなたの例に、クラスと呼び出しコードの中に、より多くのコードを追加してください。 – Michael

0

だから、リセット変数にしようとしています。
本当に、変数を初めて作成するのと同じです。

class Base: 
    var = 12 
class Cls(Base): 
    var = 'abc' 

クラスの変数は、新しいクラスを作成するときにコピーされたので、これらのベースを属し変数が、は、新しいクラスからを得ています。この変数が彼のものでない場合、新しいクラスはそのベースにリダイレクトされます。

したがって、クラス(を参照)を編集すると、関数はそのクラスを参照するクラスを参照します。

class Class(Base): 
    def getVar(self): 
     return self.var 

編集と削除では、代わりにクラスで動作します。削除によってベースへの参照が削除され、編集によって古い参照が削除され、独自の値が作成されます。
ベースの変数を編集すると、クラスの変数が変更されますが、クラスを編集してもベースは編集されません。
例は次のとおりです。

class Base: 
    var = 12 
class Class(Base): 
    pass 
Class.var = Base.var #add any methods to copy like list.copy() 

class Base: 
    a = 10 
class Cls(Base): pass 

Base.a = 12 
# Now Base.a equals Cls.a 

Cls.a = 8 
# Base.a is still 12, but Cls.a is 8 

del Cls.a 
# Base.a is still 12, but there is no more of Cls.a 

は、わずか1つの解決策がある(そうないがクラスに影響を与えないベースに編集)クラスに変数深いコピーを作成するには

これは、ベースからの値が外部からコピーされ、ベースから値を実質的に切り離して、その値をクラスに付加するために機能します。非常に有用な原理は、2つの以上の下線(_)と名前とその_ _ {名前} _ _形態と一致していないが_ {クラス名} {変数名}にリネームされることであること

注。これを使用して、クラスによって同じ名前の変数を区切ることができます。

マークした箇所に関数を適用することで、オブジェクトの値を変更したいものに変更することができます。

+0

良い角度。私もこれを試してみます。私はそれが単純か複雑かを知っていました。 – Godfrey

関連する問題