ホームページ  >  記事  >  バックエンド開発  >  Python オブジェクト指向プログラミングのクラスとメソッドについて

Python オブジェクト指向プログラミングのクラスとメソッドについて

高洛峰
高洛峰オリジナル
2017-03-01 13:33:381395ブラウズ

クラスとインスタンス

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)

静的メソッドはインスタンスの属性とメソッドを使用できません

静的メソッドはクラスの属性とメソッドを使用できません

静的メソッドはクラスまたはインスタンスを通じて呼び出すことができます

静的メソッドは、クラス内にスコープされるグローバル関数と同等です

クラスメソッド (classmethod)

クラスメソッドはクラス属性とメソッドを使用できます

クラスメソッドは静的メソッドを使用できます

クラスメソッドは次のことができますクラスまたはインスタンスを通じて呼び出されます


Python オブジェクト指向プログラミングのクラスとメソッドに関するその他の記事については、PHP 中国語 Web サイトをフォローしてください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。