クラスとインスタンス
Python はオブジェクト指向言語であり、オブジェクト指向の最も重要な概念はクラスとインスタンスです。私は初めて学習したとき、これらの概念を理解するまでよく理解できなかったのを覚えています。先生は「羽の鳥は群れます」と言いました。 間違いはクラスです
羽の鳥は群れます
クラスは、実際には、同じ特徴を持ついくつかのものを 1 つのカテゴリに分類しています
class Person(object): pass
人のクラスを定義しましたが、人には次のようないくつかの特徴があります。目、口、これらを追加しましょう
class Person(object): eyes = 2 mouth = 1
その人についての情報はすでにいくつか書きましたが、でも、その人の名前はまだ残っています、例えば私、ミンクです、私は自分を悪く扱うことはできません、私はこれらを追加する必要があります
class Person(object): eyes = 2 mouth = 1 name = mink
それはとても完璧です、一人の人がついにそれを完成させました。 1 分しかかかりませんでした (冗談です)。人間には目が 2 つ、口が 1 つあります。私の名前はミンクです。なぜ人間はミンクと呼ばれるのですか?ミンクは人間の名前です。人間をミンクと呼ぶのは明らかに間違っています。例
class Person(object): eyes = 2 mouth = 1 def __init__(self, name): self.name = name me = Person('mink')今、私はみんなと共有するのではなく、自分の名前を持っています。 , このメソッドはインスタンスと呼ばれていますが、私は他の人が知らないスキルを持っています、私は重力の影響を受けません
class Person(object): eyes = 2 mouth = 1 def __init__(self, name) self.name = name def jineng(self, txt): print "%s %s" % (self.name, txt) me = Person('mink') me.jineng("我不受重力影响, 我会飞")
クラスメソッドと静的メソッド
でよく見かける@classmethodと@staticmethod Python では、クラス メソッドとインスタンス メソッドと呼ばれます。
class Animal(object): name = 'lili' age = 1 cat = Animal() print cat.name, cat.age # print 'lili' 1動物クラスを作成し、猫のインスタンスを生成し、猫の名前と年齢を出力すると、返されるのは動物の属性であることがわかります。つまり、インスタンスはクラスの
属性にアクセスします
# 显示内容是一样的 print cat.name, cat.age print Animal.name, Animal.age 给Animal类添加一个方法(函数) class Animal(object): name = 'lili' age = 1 def edit(self, name, age): self.name = name self.age = age cat = Animal() cat.edit('rol', 2) print cat.name, cat.age # print 'rol' 2 print Animal.name, Animal.age # print 'lili' 1つまり、デフォルトで追加されるこのメソッドは、インスタンス メソッド、インスタンス メソッドです。インスタンスの属性は変更されますが、その属性はクラスは変更されません
# 我们修改一下这个函数 def edit(self, name, age): name = name self.age = age cat = Animal() cat.edit('rol', 2) print cat.name, cat.age # pirnt 'rol' 2 print Animal.name, cat.age # print 'lili' 1インスタンスメソッドはクラスの属性を変更できないということですが、クラスの属性を変更したい場合はどうすればよいですか
# 再一次修改edit @classmethod def edit(cls, name, age): cls.name = name cls.age = age cat = Animal() cat.edit('rol', 2) print cat.name, cat.age # print 'rol' 2 print Animal.name, Animal.age # print 'rol' 2何が必要ですかここで注意するのは edit です。関数の最初のパラメータは self から cls に変更されます。Python では、クラス メソッドでは cls を使用し、インスタンス メソッドのパラメータは self であることが推奨されています。インスタンスはクラスメソッド(関数)を使用できます
次に、これを与えます クラスは属性を初期化するためのinitメソッドを追加します
class Animal(object): name = 'lili' age = 1 def __init__(self, name, age): self.name = name self.age = age ... cat = Animal('kuku', 4) cat.edit('rol', 2) print cat.name, cat.age # print 'kuku' 4 print Animal.name, Animal.age # print 'rol' 2__init__を追加した後、catはクラスの属性を使用しなくなり、編集を変更しますメソッドは cat インスタンスの属性を変更しません。
# 添加staticmethod @staticmethod def say_name(name=None): if not name: name = self.name print 'my name is %s.' % name cat = Animal('kaka', 3) cat.say_name() # 运行的话会报 NameError: global name 'self' is not defined # 那是不是没给他添加self字段, 所以没找到 def say_name(self, name=None): ... cat.say_name() # TypeError: say_name() takes at least 1 argument(0 given), 显示缺少参数これは、Staticmethod がインスタンスの属性とメソッドを使用できないことを示しており、もちろんクラスを使用できないことを示しています
# 我们修改一下代码 # 先创建一个实例的方法, 他使用类的staticmethod @staticmethod def say_name(name): print 'my name is %s.' % name def say(self): self.say_name(self.name) @classmethod def _say(cls): cls.say_name(cls.name) cat = Animal('kaka', 3) cat.say() cat._say()。クラスメソッドとインスタンスメソッドを通じて静的メソッドにアクセスできます。
要約すると:
静的メソッド (staticmethod)