python学习笔记——类

来源:互联网 发布:好用房产软件 编辑:程序博客网 时间:2024/06/06 01:36

类的基本知识点记录

1.旧式类和新式类

-python的新式类是在2.2引进的,之前的类叫做旧式类或者经典类。在2.2之前,类和类型是两个不同的概念,引入新式类将两者进行了统一(这句话我没有看明白什么意

思)。新式类的基类搜索机制是广度优先遍历,而旧式类的基类搜索机制是深度优先遍历。默认情况下用户定义的类为旧式类,如果需要定义新式类,有两种方法:

#在定义新式类前,把下面这句话放到模块的最前面
__metaclass__ = type
#直接或间接的继承object类
class NewObject(object):
def __init__(self):
pass
2.self
-在类定义的函数中,默认第一个参数应该是self,即这个类本身,每次调用函数时,函数自动将所在类作为参数传入进去。除此之外,如果需要调用类中的属性,也需要通过
self这个参数self'.属性来进行调用。
-self参数正是方法和函数的区别。方法将第一个参数绑定到它所属的实例上,因此这个参数可以不必由调用者显示的传入。
3.私有
-python不支持私有方式。但是可以用一些小技巧来避免外部直接可以访问到这些属性或者方法。
-为了让方法或者特性变为私有(从外部无法访问),在它的名字前加上双下划线即可:
class test:
def __method1(self,x):
print x
执行
>>> test = test()
>>> test.__method1('a')
 
Traceback (most recent call last):
File "<pyshell#22>", line 1, in <module>
test.__method1('a')
AttributeError: test instance has no attribute '__method1'
-原理,类的内部定义中,所有以双下划线开头的名字都被“翻译”成前面加上单下划线和类名的形式。
>>> class Test:
def __method1(self):
print 'a'
 
>>> test = Test()
>>> test
<__main__.Test instance at 0x0000000002AD7E08>
>>> test._Test__method1()
a
>>> test.__method1()
 
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
test.__method1()
AttributeError: Test instance has no attribute '__method1'
-除此之外,如果不需要这样的方法但是又想让其他对象不要访问内部数据,可以使用单下划线。前面带有下划线的名字都不会被带星号的imports语句导入
from module import *
4.超类
-在定义类的时候,类名后加括号,括号内就是要继承的超类类名,类名之间以逗号间隔。
-注意多重继承,如果一个方法从多个超类继承,那么需要注意一下这些超类的顺序,先继承的类中的方法会重写后继承的类中的方法。。这个好像很别扭
>>> class ClassA:
def talk(self):
print 'this is A talking'
 
>>> class ClassB:
def talk(self):
print 'this is B talking'
 
>>> class ClassC(ClassA,ClassB):
def ctalk(self):
print 'c is talking'
 
>>> c = ClassC()
>>> c.talk()
this is A talking
5.接口
-python里面竟然不需要显示的定义接口...和java完全不同,不需要显示的规定对象必须包含哪些方法才能作为某个方法的参数使用...可以在使用对象的时候假定已经实现了接
口,如果不能实现的话,程序自然会失败...
-这里有几个方法来检查方法是否存在,是否可以被调用。
-hasattr(对象名,方法名)方法,判断方法在该对象内是否存在
>>> class ClassA:
def func1(self):
print 'this is func1'
 
>>> cla_a = ClassA()
>>> hasattr(cla_a,'func1')
True
>>> hasattr(cla_a,'func2')
False
-callable(对象名),判断特性是否可用
>>> callable(getattr(cla_a,'func1',None))
True
>>> callable(getattr(cla_a,'func2',None))
False
>>> callable(getattr(cla_b,'__func2',None))
False
0 0
原创粉丝点击