Python으로 객체 지향 프로그래밍을 작성하고 싶다는 사실을 알았을 때 저는 주저하고 불안했습니다. 나는 이런 생각을 해왔습니다. 이 구멍을 어떻게 올라가야 할까요? 파이썬에는 객체지향적인 내용이 많기 때문에, 자세히 설명하고 싶다면 객체지향적 사고를 활용하여 이전 내용을 다시 배우는 것이 가장 좋습니다. 이 구덩이는 너무 커서 많은 망설임 끝에 중요한 내용을 선택합시다. 부족한 내용은 모두가 보완할 수 있습니다.
제가 사용하는 버전은 python2.7이라 버전별로 차이가 있을 수 있습니다.
자, 시작하기 전에 질문에 대해 생각해 보고 코드를 살펴보겠습니다.
왜 값만 생성하고 할당하는가? 내가 아직 작성하지 않은 방법을 사용하시겠습니까?
어떤 친구들은 이렇게 말할 수도 있습니다. a는 현재 문자열 객체이기 때문에 물론 문자열 메서드를 사용할 수 있습니다. 이러한 메서드는 Python으로 미리 작성되어 있습니다.
그럼 질문을 바꿔보겠습니다. 왜 파이썬은 그것이 문자열 객체라는 것을 알고 있나요?
이 문제에 대해 심도 있게 이야기하기 전에 한 문장을 기억하세요. Python의 모든 것은 객체이고 객체는 클래스에 의해 생성됩니다.
그럼 클래스란 무엇인가요? 여기서 예를 들어보겠습니다.
어느 날 길을 걷고 있는데 갑자기 눈앞에 적이 보였다. 이때 때리고 싶었지만 힘이 서로 작용해서 때리면 주먹이 아팠다. 아, 이때 길가에서 돌을 발견했습니다. 경찰이 어떻게 생각하든 크기와 모양이 딱 맞았습니다. 그런 다음 나는 돌을 집어 들고 착한 소년이 흉내낼 수 없는 몇 가지 행동을 적에게 행한 다음 나의 장점과 명성을 숨기고 집으로 돌아갔습니다.
이 과정에서 우리는 왜 그것이 돌인지 알 수 있을까?
돌 모양이니까!
돌이 사람을 칠 수 있다는 것을 왜 알까요?
돌이 단단하니까요!
돌이 단단하다는 것을 왜 알까요?
왜냐하면...글쎄...제가 어렸을 때 아버지께서 말씀하셨거든요.
이 시점에서 우리는 결론을 내릴 수 있습니다. 우리는 이미 우리 마음 속에 사물에 대한 개념을 갖고 있기 때문에 사물이 무엇인지, 그것이 어떤 기능을 가지고 있는지 알고 있습니다. 이 개념은 선배들에게서 알 수도 있고, 여러 가지 실험을 거쳐 스스로 정리한 것일 수도 있다. '블랙홀'에 대한 우리의 이해와 유사하게, 블랙홀은 과학자들의 다양한 연구에서 파생되었습니다.
돌로 사람을 때리는 예제를 코드로 구현하는 방법:
class Stone(object): # 我创建一个叫Stone的类 def attack(self): print '把头伸过来,我给你加个buff' a = Stone() # 我用类创建了一个对象,也称为类的实例化 a.attack() # 我使用这个对象的方法
좋아요, 그게 바로 우리에게 필요한 것이었습니다.
다른 객체를 생성하는 경우:
분명히 Python에는 없습니다. 우리를 위해 준비된 공격 방법이 없으므로 사용할 수 없습니다.
소위 클래스는 추상적인 정의일 뿐이고 인스턴스는 구체적인 객체입니다. 그 차이는 내 마음의 돌과 내 손의 돌과 같으니 후자만이 실제이다. 물론 여기서 이상주의라던가 그런 얘기는 하지 마세요.
이것을 보면 클래스와 객체의 관계가 더욱 명확해 져야 합니다. 일부 학생들은 다음과 같이 질문할 수 있습니다. Python의 모든 클래스는 우리가 미리 작성했습니다. Python이 자동으로 클래스를 생성한 다음 특정 시간에 이 클래스를 사용할 수 있는 방법이 있습니까? 축하합니다, 학우 여러분, 아마도 인공지능의 문턱에 도달했을 것입니다. 그것이 실현될 수 있다면 그것은 우리 인간의 학습 능력과 비슷하지 않을까요? 글쎄요, 이건 단지 제 생각일 뿐이고, 실제 인공지능을 어떻게 구현하는지는 잘 모르겠습니다. 하지만 프로그래머로서 인공지능을 프로그래밍할 수 있다는 것은 어쩌면 당연한 일입니다. 평생 추구하십시오.
클래스와 인스턴스화가 무엇인지 알아보고, 클래스의 기본 구문을 살펴보겠습니다.
먼저 함수를 정의하는 def와 마찬가지로 class는 클래스를 정의하는 키워드입니다.
紧接着的是类名,这个可以自定义,同样的,不能和python的内置关键字冲突。另外,建议避开python的内建类型,例如 str、int之类的名字。规范的命名应该遵从“驼峰命名法”,例如: MyClass 这里的命名,每个单词的首字母大写。
然后是一个括号,里面的参数是用于继承的,一般继承于 object,表示一个新式类。另外,你可能见过没有括号的写法,这是经典类的写法。
示例:
class NewClass(object): pass class OldClass: pass New = NewClass() # 创建一个新式类的实例 Old = OldClass() # 创建一个经典类的实例
这就是类的基本语法,当然这样还是不够的,但是在更深入之前,我想先讲一个新旧式类的差别。
在这里,我们先打印一下两个变量的类型:
print type(New) print type(Old)
可以看下两者的输出是不同的。
在早于python2.2的版本时,只有经典类这一种写法,当时,类和类型没有合并。
类是类对象,实例是实例对象,这两个对象之间没有任何关系。
这句话是什么意思?看代码:
print type(OldClass) print type(Old)
我们可以看见其输出很含糊,经典类属于类对象,无论是哪个类,都统一为“类”类型,实例属于实例类型,却不知道其是由哪个类创建的,所以的实例都统一为“实例”类型。也就是说当时的类型用 classobj 和 instance 代表了所以的类和实例,无论你是哪个类,又或是哪个类创建的实例。
这样的信息实在太少,而类和类型之间非常混乱。为了解决这种情况,在 python2.2 中引入了新式类,并进行了类和类型的同统一。
print type(NewClass) print type(New)
类的类型是 type?type 返回的对象还能像类一样创新新对象?
总结的来说:在新式类中,所以的类对象都是 type 的实例。而不同的类对象有能创建出其对应的实例。
class NewClass(object): def __init__(self, val): self.val = val New = NewClass(123) b = type(New)(321) # 对实例来说type返回的是类对象,我又可以用类对象来和创建新的实例 print b.val
构造器方法
一般可以理解类中的函数就是方法,而方法分为:实例方法,只有实例化后才能调用的,其第一个参数一般为 self,代表实例本身;类方法,其第一个参数为 cls,代表类本身;还有静态方法,就是个普通函数,没有要求参数。
1. __init__(self [,arg1,....]):
当类被调用进行实例化的时候,python会自动调用类里面的构造函数(如果有的话),在构造函数中,可以进行各种初始化的操作,最常见的就是上面的进行实例的属性的创建。
python 在示例化的时候,会检查其实行了 __init__ 方法了没有,如果没有则不对实例进行任何操作,然后返回对象。如果实行了这个方法,则自动调用这个方法,并自动将 self 传进行,也就是说我们在实例化进行传参的时候,将不用理会 self,直接传给后面的参数。
讲到属性,就必须要提一下什么是属性。属性这个对象其实更像一个变量,大多数对象都可以有属性(不包括python的内置类型),例如函数。
def Test(): pass Test.a = 123 print Test.a
因为函数也是一个对象。
属性在类中,就是一个变量,例如:
class NewClass(object): a = 123 print NewClass.a
当然,因为 python 的特性,我们可以在运作中为某个对象添加属性,而不用一开始就在类中写定。
注意,这个方法应该返回 None,也就是说我们一般不用 return 任何对象,让它默认返回就行了。
2. __new__(cls [,arg1,....]):
这也是一个构造器方法,它是一个类方法,一般在对 python 的不可变数据类型进行继承扩展的时候用的比较多。
某处拿来的代码示例:
class RoundFloat(float): def __new__(cls, val): return super(RoundFloat, cls).__new__(cls, round(val, 2)) a = RoundFloat(3.14159) print a
解构器方法
__del__(self [,arg1,....])
这个方法将会在对象所以的引用被清除后才执行,例如:
class Test(object): def __del__(self): print '我被干掉了,兄弟们为我报仇!' a = Test() # 创建了一个对象 b = a # b又引用了a c = b # c又引用了b,现在 a 所指向的对象有3次引用,相当有三条命 del a # 干掉一条命 del b # 又干掉 del c # 听说你有3条命?全部干掉!
注意,这里只输出了一次,也就是说到了最后才删除完毕。这里要注意一下几点:
1.调用 del 并不意味着完成删除某个对象,只是减少引用。
2.如果你有一个循环引用或其它的原因,让一个实例的引用逗留不去,该对象的__del__()可能永远不会被执行。
3.__del__()未捕获的异常会被忽略掉(因为一些在__del__()用到的变量或许已经被删除了)。 不要在__del__()中干与实例没任何关系的事情。
4.一般情况下并不用实现这个方法,因为这样有一定的风险。
5.如果你定义了__del__,并且实例是某个循环的一部分,垃圾回收器将不会终止这个循环— —你需要自已显式调用 del。
6.如果继承了父类,且父类中也有解构器,要记得调用。否则可能会有某些在父类中的清理方法没有调用到,出现以下无法预料的错误。
以上这篇浅谈Python의 객체지향 및 클래스 기본 구문就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持PHP中文网。
更多Python의 객체지향 및 클래스 기본 구문相关文章请关注PHP中文网!