class的基本定义
class test(object):
a = 1
def func_1(self):
return self.arg1,self.arg2
def __init__(self,arg1,arg2): #构造函数
self.arg1 = arg1 #将参数引用到类的内部
self.arg2 = arg2
def __del__(self): #析构函数
del self.arg1
del self.arg2
注:
1. a 被称为类test的属性
2. func_1 被称为类test的方法
3. 所有的class都是object的派生类
基本继承:一个子类可以继承它的基类任何属性
class Base(object):
def __init__(self,name):
self.name = name
class b(Base): #这是python中继承的方法
def get_name(self):
return self.name
new_class = b (‘lilei’)
print new_class.get_name()
注意:子类重写__init__
不会自动调用基类的__init__
:与java不同。
类的特殊属性:
对于任何类C,C具有六个特殊属性:
C.__name__ 类的名字(字符串);
C.__doc__ 类的文档字符串(不能继承);
C.__bases__ 类C的所有父类构成的元组
C.__dict__ 类C的属性(字典)
C.__module__ 类C定义所在的模块
C.__class__ 实例C所对应的类(用的较少,只在新式类中)
对于实例属性c = C()具有两个特殊属性:
c.__class__ 实例c的类
c.__dict__ c的属性
从实例中访问类属性需谨慎: 给一个与类属性同名的实例属性赋值,我们会“隐藏”类属性。即实例对于属性进行的修改只位于实例中,类中的同名属性不会改变。但是类属性的修改会影响到所有实例。
class Foo(object):
x = 1.5
foo = Foo()
foo.x #值为1.5
foo.x = 1.7 #或者foo.x += 0.2
Foo.x #值仍为1.5
静态方法和类方法
静态方法:不需实例化,可以直接用类名调用的方法。
类方法:可以通过类或它的实例来调用的方法。不管你是用类来调用这个方法还是类实例调用这个方法,该方法的第一个参数总是定义该方法的类对象。
staticmethod() 创建静态方法,不需要self作为第一个参数 @staticmethod
classmethod() 创建类方法,很多人使用cls作为变量名。 @classmethod
class TestStaticMethod:
def foo():
print ‘hahaha'
foo = staticmethod(foo) #如果没有这个内建函数,会报错,因为没有self参数
class TestClassMethod:
def foo(cls):
print ‘hehehe'
foo = classmethod(foo) #同上
##现在可以用函数修饰符代替上面的方式(推荐):
class TestStaticMethod:
@staticmethod
def foo():
print ‘hahaha'
class TestClassMethod:
@classmethod
def foo(cls):
print ‘hehehe'
私有化
python属性默认是公开的。使用访问控制符来限定成员函数的访问,将对象数据隐藏,实现封装。
1. 双下划线(__)
:由双下划线开始的属性在运行时不能直接访问。
2. 单下划线(_)
:简单的模块级私有化只需在属性(或函数)名前使用单下划线字符,阻止模块属性用import来加载。
用特殊方法定制类
特殊方法允许类通过重载标准操作符来模拟标准类型,这些方法都是以双下划线开始及结尾的。
1. 模拟标准类型
2. 重载操作符
__add__(self,obj)方法 重载 +
__iadd__()方法 重载+=
__sub__()方法 重载 -
__mul__()方法 重载 *
__div__()方法 重载/
使用对象内置的方法
绑定:方法只有在其所属类拥有实例的时候才能被调用,
非绑定:在子类构造器__init__()
中调用覆盖的父类__init__()
方法中使用(__del__()
同)
1. 实例化这个class (test) t = test()
2. 使用 class.method()
的方式去调用 class 的内置方法。
注意:当定义一个class的内置方法method时,method的参数的第一个永远是self。
一些有用的内建函数
issubclass(sub,sup)
:判断一个类是否是另一个类的子类,返回布尔值isinstance(obj1,obj2)
:判定一个对象是否是另一个给定类的实例,返回布尔值。*attr()
系列函数可以在各种对象下工作hasattr(obj,’attr’) :判断一个对象是否具有特定的属性,返回布尔值 gettattr(obj,’attr’):取得相应属性的值。 setattr() delattr()
super()
:帮助找出相应的父类,然后方便调用相关属性。super(MyClass,self).__init__()