2

私は本当に単純な問題を理解しようとしていますが、クラスがどのように機能するかはまだわかりません。たとえば、「name」という属性を持つ「Friend」というクラスを作成したい場合、これは「name」という変数を何よりも先に指定する必要があるということですか? 次に、「名前」の指定を許可するようにコンストラクターを定義するにはどうすればよいですか? このコードはナンセンスですか?ご回答ありがとうございます。

class Friend:

    def __init__(self,name):
        self.set_name(name)


    def set_name(self,name):
        self.name=name

    def get_name(self):
        return self.name
4

2 に答える 2

8

そのコードは、達成したいことを達成するのでナンセンスではありません。ただし、あまりPythonicではありません。ゲッターまたはセッターを使用する理由はありません。属性に直接アクセスするだけです。お気に入り

class Friend:

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

クラスをインスタンス化することができます

friend = Friend('jeremy')

今すぐname直接アクセスするだけです

print friend.name # jeremy

python クラスについて学ぶことはたくさんあります。幸いなことに、python は、使用しているバージョンに関係なく優れたドキュメントを提供します。

この例では、新しい友達を作成するには、名前を付けてインスタンス化する必要があります。

于 2012-12-06T21:30:14.610 に答える
2

あなたが参照しているのは、デフォルトのキーワード引数です。name例で指定した方法は、コンストラクターで必要であることを意味します。デフォルトにする(そしてコンストラクターの後に設定できるようにする)方法は、次のようになります。

class Friend(object):

    def __init__(self,name=''):
        self.name = name

    def set_name(self,name):
        self.name=name

    def get_name(self):
        return self.name

これで、名前なしでクラスをインスタンス化できます。

aFriend = Friend()

コメントで示唆されているように、基本属性のセッターとゲッターを持つことは「pythonic と見なされる」ことではありません。ただし、その属性が計算を必要とする場合は、それをプロパティにすることができます。

class Friend(object):

    def __init__(self, firstname='', lastname=''):
        self.firstname = firstname
        self.lastname = lastname

    @property
    def firstname(self):
        return self._first

    @firstname.setter
    def firstname(self, n):
        self._first = n.capitalize()

    @property
    def lastname(self):
        return self._last

    @lastname.setter
    def lastname(self, n):
        self._last = n.capitalize()        

    @property
    def fullname(self):
        return "{0} {1}".format(self.firstname, self.lastname)   

f = Friend('frank')
f.lastname = 'smith'

f.firstname
# 'Frank'

f.lastname
#'Smith'

f.fullname
#'Frank Smith'
于 2012-12-06T21:31:06.117 に答える