2017-06-01 14 views
0

私は自分でpythonを学習しています。今私はアドレス帳をコードしようとします。 私はあなたがそれを使うべきだと読んだのですが、なぜなら、このクラスにあるすべての関数(insertaddress、deletaddres、...など)を定義せずに、通常の関数のように使うことができるからです。または私は間違っていますか?私のクラスをインポートして使用するとエラーが発生します

が、私は1を作成したクラスといくつかの練習を得るために:

class Addressbook(): 

    def __init__(self,last,first,street,num,plz,place): 

     self.last=last 
     self.first=first 
     self.street=street 
     self.num=num 
     self.plz=plz 
     self.place=place 

    def insertadd(self): 
     text =self.last+" "+self.first+" "+self.street+"  
     "+self.num+" "+self.plz+" "+self.place+"\n" 
     with open("addressbook.txt", "a") as file: 
      file.write(text) 

私のメインのファイルで:

from klassen import Addressbook 

k.last= input() 
k.first=input() 
(...) 
k.place = input() 

k.insertadd() 

しかし、私はfrom klassen import Addressbook as k経由で私のクラスをインポートし、私にクラス属性をリンク入力:k.first=input("text")k.insertadd()機能を実行しようとするとエラーメッセージが表示されます。

NameError: name 'self' is not defined 

私は私の機能私は「場所」が不足しているPARAMTERであることを私に告げるエラーを取得し、入力として持っておきPARAMTERを与えます。

私を助けてもらえますか?

あなたがすべき
+1

ウェルカムから

。ヘルプドキュメントの投稿ガイドラインを読み、それに従ってください。 [最小、完全で検証可能な例](http://stackoverflow.com/help/mcve)がここに適用されます。 MCVEコードを投稿して問題を正確に記述するまでは、効果的にお手伝いすることはできません。 投稿したコードをテキストファイルに貼り付け、説明した問題を再現できるはずです。 – Prune

+2

あなたはクラスの仕組みについていくつかの誤解があるようです。クラスオブジェクトを直接使用してデータを保持しようとしているようです。それをしないでください。クラスのインスタンスを1つ以上作成する必要があります。そして、当時はAddressbookクラスのインポートを忘れていました。最初に単一のスクリプトファイルでこれを動作させてください。一度すべてがうまくいくと、それを複数のファイルに分割したいかもしれませんが、おそらくそれを行う必要はありません。PythonはJavaではありません。 –

+0

私の友人コードはC++であり、クラスと関数用に余分なファイルを作成することでコードをより構造化できると教えてくれました。私のメインは読むほうがよいでしょう。 小規模なプロジェクトや一般的に複数のファイルを意味しませんか? – Omikron

答えて

0

from klassen import Addressbook 
k = Addressbook("","","","","","") # Init it with the variables you want! 

次にあなたがオブジェクトとしてKを使用することができます...

あなたがやっていた方法で、あなたは、アドレス帳オブジェクトのインスタンスを作成していなかったあなたが使用していましたクラスオブジェクト自体...

0

特定の関数セットをまとめてカプセル化するか、機能を抽象化する場合には、クラスを使用するのが一般的です。

「アドレス帳」には、さまざまなアプリケーションで使用される一連の機能が含まれているとします。たとえば、「電話帳」、「メッセージングアプリケーション」など。クラスのそれぞれをクラスとして分離することで、コードや関連するリソースをより冗長性の少ない、より詳細に制御できます。したがって、保守性が向上します。

コードでは、すべての変数を初期化する必要があります。または、少なくとものinit関数に渡します。クラッセンインポートアドレス帳から

K =アドレス帳( "バー"、 "FOO"、 "15 XYZストリート"、1234444212、 "ABC"、 "ニューヨーク")

k.insertadd()

またはそれ以外の処理方法は、init関数をデフォルトとして「なし」パラメータを受け入れる関数で初期化することです。

例: クラス帳():

def __init__(self,last,first,street = None,num,plz = None,place = None): 

    self.last=last 
    self.first=first 
    self.street=street 
    self.num=num 
    self.plz=plz 
    self.place=place 

今、オブジェクトはすべてのパラメータを必要としません。クラッセンインポートアドレス帳

K =アドレス帳(=最後の "バー"、第= "FOO"、NUM = 1234444212)

k.insertadd()StackOverflowのに

関連する問題