2017-07-21 9 views
0

私はこのタイトルを入力して自分自身を混乱させたので、何らかの説明が必要な場合はお知らせください。 私はPython Crash Courseを通してEric Matthesに挑戦しています。演習の1つは、私が答えを見つけることができなかったという質問をもたらしました。また、明らかに、私は次のコードを適切にフォーマットする方法を理解できません。問題の行使のための コードは次のとおりです。Python:異なるクラスのインスタンス内で作成されているクラスのインスタンスの属性に値を渡すにはどうすればよいですか?

class User(): 
    """Store info about a user profile""" 

    def __init__(self, first_name, last_name, email, username): 
     """Init common profile info""" 
     self.first_name = first_name 
     self.last_name = last_name 
     self.email = email 
     self.username = username 
     self.login_attempts = 0 

    def describe_user(self): 
     """Print users info""" 
     print("User info summary: \n\t" + 
      self.first_name.title() + " " + 
      self.last_name.title() + "\n\t" + 
      self.username + "\n\t" + 
      self.email 
      ) 

    def greet_user(self): 
     """Print a short greeting""" 
     print("Welcome, " + self.first_name.title() + "!") 

    def increment_login_attempts(self): 
     """Increments the number of login attempts by 1""" 
     self.login_attempts += 1 

    def reset_login_attempts(self): 
     """Rest value of login_attempts to 0""" 
     self.login_attempts = 0 

class Privileges(): 
    """Represents a list of privileges""" 

    def __init__(self, privileges=[]): 
     """Initialize attributes for Privileges""" 
     self.privileges = privileges 

    def show_privileges(self): 
     """Print the list of privileges for this admin""" 
     for item in self.privileges: 
      print(item.title()) 

class Admin(User): 
    """Model an administrative user""" 

    def __init__(self, first_name, last_name, username, email): 
     """Initialize attributes of Admin""" 
     super().__init__(first_name, last_name, username, email) 
     self.privileges = Privileges(['can add user', 'can block user']) 

bbob = Admin('billy', 'bob', 'bbob', 'blah') 
bbob.privileges.show_privileges() 

OKので、私は時間Iで、Adminの内部で作成されていたクラスPrivilegesのインスタンスへの権限のリストを提供できるようにしたいのですがAdminのインスタンスを作成しています。これはすべて意味がありますか?私がそれを打つたびに私は混乱します。実際のアプリケーションでは、Admin__init__メソッドのように、クラス定義にそのリストを指定するのは無理でしょう。それは、引数や何か、クラスとして渡すことができる必要がありますか?

ありがとうございました。これを読んでいただきありがとうございます。これが意味をなさないかどうか私に教えてください。

+0

コードの書式を修正しました。正しくない場合は教えてください。 –

+2

'def __init __(self、privileges = []):'を実行するのは良い考えではありません。デフォルトのargsは、関数やメソッドが呼び出されたときではなく、関数が定義されたときに評価されるため、明示的な 'privile'リストなしで作成されたすべての' Privileges'インスタンスはそのデフォルトリストを共有します。 https://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argumentを参照してください。これを処理する通常の方法は、argにデフォルト値の「None」を与え、本文に関数の何かが '特権がNoneならば何かをします:privileges = []' –

+0

それはもっとよかったよ、ありがとう! – CCramer

答えて

2

含まれているオブジェクトの設定が便利で便利です。それはあなたに純粋な点を得ることができないかもしれませんし、クラスをもつれますが、それは便利であり、少なくともいくつかの絡み合いは自然であり、避けられる必要はありません。

class Admin(User): 

    def __init__(self, first_name, last_name, username, email, 
        extra_privileges=None): 
     """Initialize attributes of Admin""" 
     super().__init__(first_name, last_name, username, email) 
     privileges = ['can add user', 'can block user'] 
     privileges += extra_privileges or [] 
     self.privileges = Privileges(privileges) 

bbob = Admin('billy', 'bob', 'bbob', 'blah') 
ssara = Admin('sara', 'smith', 'ssara', 'blatz', ['can read emails']) 

最後の注意:パラメータリストAdminsは、いくつかのデフォルトの権限を持っている場合、 開発者は、必要に応じてそれらを追加できるようにするだけで、より良いおそらく、

class Admin(User): 

    def __init__(self, first_name, last_name, username, email, 
        privileges): 
     """Initialize attributes of Admin""" 
     super().__init__(first_name, last_name, username, email) 
     self.privileges = Privileges(privileges) 

bbob = Admin('billy', 'bob', 'bbob', 'blah', 
       ['can add user', 'can block user']) 

または:ちょうど別のパラメータを追加ではなくにリストのような可変構造が含まれていれば、それを避けることができます。微妙だが重要な副作用は、あなたが本当に期待していないことをすることができます。これは基本的にPython gotcha #1です。あなたがnullのデフォルトを持っている場合は代わりに、Noneを使用します。

def __init__(self, privileges=None): 
    """Initialize attributes for Privileges""" 
    self.privileges = privileges or [] 

この方法は、__init__はなし権限で呼び出された場合、self.privilegesは以前のように空のリストを取得します。または、彼らがリストを提供する場合、それがとられます。しかし、厄介な副作用なし。

+0

私はまだ 'None'に慣れていません。それは基本的に' Null'ですか?私は他の言語で使われている 'Null'を見ました。したがって、 'self.privileges = privileges or []'という行は、 'privileges'が空(false)で' self.privileges'が空のリストを取得したとします。そしてデフォルトパラメータとして 'None'を使うことは、それに空のリストを与えることに内在する副作用を防ぎますか?また、最初の例のように新しいパラメータを追加することは、後の見方では明らかです。ありがとうございます – CCramer

+0

@CCramerはい、それはすべて正しいです。 'None'はPythonのNullです。これはシングルトンなので、Pythonプログラムには 'None'オブジェクトしかないので、' if x is None'のようなものを安全かつ効率的に行うことができます。 –

+0

素晴らしい!あなたのお役に立ってくれてありがとうございました! – CCramer

関連する問題