클래스와 인스턴스
파이썬은 객체지향 언어인데, 객체지향의 가장 중요한 개념은 클래스와 인스턴스가 아니었던 것으로 기억합니다. 처음 배웠을 때 개념을 잘 이해했어요. 선생님이 "깃털새가 모인다"고 하더군요. 그렇죠, 분류
깃털새가 모인다는 것입니다
실제로 동일한 특성을 가진 것들을 하나의 카테고리로 묶는 것이 클래스입니다. 예를 들어 인간
class Person(object): pass
인간을 정의했습니다. 클래스이지만 인간에게는 두 눈과 입과 같은 몇 가지 특성이 있으므로
class Person(object): eyes = 2 mouth = 1
에 추가합니다. 이미 그 사람에 대한 정보를 몇 개 작성했지만 저 사람은 아직 이름이 있어요, 저처럼 밍크.. 뭐 나쁘게 대할 수는 없어요.
class Person(object): eyes = 2 mouth = 1 name = mink
너무 완벽해요. 사람이 드디어 완성했는데 1분 걸렸네요(농담) 메시지를 읽어보시죠. 인간은 눈이 두 개고, 입도 하나 있는데, 이름이 밍크예요 - -! 내 이름이요~ 인간은 왜 밍크라고 불리는 걸까요?
밍크는 인간의 이름입니다. 인간의 이름이 밍크라는 것은 명백히 잘못된 것입니다. "wo"는 인간 개인이어야 합니다
rreee
이제 모두에게 공유하는 대신 나만의 이름이 생겼습니다. 이 방법을 인스턴스라고 합니다. 하지만 남들에게는 없는 스킬이 있어서 중력에 영향을 받지 않습니다. .
class Person(object): eyes = 2 mouth = 1 def __init__(self, name): self.name = name me = Person('mink')
클래스 메소드와 정적 메소드
python 클래스 메소드라고 불리는 @classmethod, @staticmethod를 자주 볼 수 있습니다.
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("我不受重力影响, 我会飞")
는 동물 클래스를 생성하고 고양이 인스턴스를 생성하고, 고양이의 이름과 나이를 인쇄하면 Animal의 속성을 볼 수 있습니다. 즉, 인스턴스는
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
여기서 주목해야 할 것은 의 첫 번째 매개변수입니다. 편집 함수 Self는 cls가 됩니다. Python에서는 클래스 메서드에서 cls를 사용하는 것이 좋으며 인스턴스 메서드의 매개 변수는 self이며 여기서는 인스턴스가 클래스 메서드(함수)를 사용할 수 있다고 설명합니다.
그러면 추가하겠습니다. 속성을 초기화하려면
# 再一次修改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
__init__을 추가한 후 cat은 더 이상 클래스의 속성을 사용하지 않으며 edit 메소드를 수정하면 됩니다. cat 인스턴스의 속성을 변경하지 마세요.
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
이는 정적 메서드가 인스턴스의 속성과 메서드를 사용할 수 없으며, 물론 클래스도 사용할 수 없음을 의미합니다. 그 반대는 사실입니다
# 添加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)
정적 메소드는 인스턴스를 사용할 수 없습니다. 속성 및 메소드
정적 메소드는 클래스의 속성 및 메소드를 사용할 수 없습니다.
정적 메소드는 클래스 또는 인스턴스를 통해 호출할 수 있습니다.
정적 메소드는 클래스 내에 범위가 있는 전역 함수와 동일합니다
클래스 메소드(classmethod)
클래스 메소드는 클래스의 속성과 메소드를 사용할 수 있습니다
클래스 메소드는 정적 메소드를 사용할 수 있습니다
클래스 메소드는 클래스 또는 인스턴스 호출을 사용할 수 있습니다.
Python 객체의 클래스 및 메소드에 대한 추가 기사를 보려면- 프로그래밍 지향적이라면 PHP 중국어 웹사이트를 주목하세요!