Python中的类class

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。

一些有用的内建函数

  1. issubclass(sub,sup) :判断一个类是否是另一个类的子类,返回布尔值
  2. isinstance(obj1,obj2):判定一个对象是否是另一个给定类的实例,返回布尔值。
  3. *attr()系列函数可以在各种对象下工作

    hasattr(obj,’attr’)  :判断一个对象是否具有特定的属性,返回布尔值  
    gettattr(obj,’attr’):取得相应属性的值。
    setattr()   
    delattr()
    
  4. super():帮助找出相应的父类,然后方便调用相关属性。super(MyClass,self).__init__()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值