Python类和实例

Python类和实例

1.Python类和实例

(1)类是一种数据结构,可用于创建实例
    *一般情况下,类封装了数据和可用于该数据的方法
(2)Python类是一个可调用对象,即类对象
(3)类是一种自定义类型,而实例则是声明某个自定义类型的变量
(4)实例初始化
    *通过调用类来创建实例

    *类在实例化时可以使用__init__和__del__两个特殊方法

In [12]: l1 = ['a','b','c','d']

In [13]: type(list)
Out[13]: type       #类

In [14]: type(l1)
Out[14]: list

2.Python中创建类

*python中使用 class 关键字创建类
*类名必须首字母大写
(1)class ClassName(base):
    'class documentation string'
    class suite
(2)超类是一个或多个用于继承的父类集合
(3)类体可以包含:声明语句|类成员定义|数据属性|方法
*注意:
    如果不存在继承关系,ClassName后面的"(base)"可以不提供
    类文档可选
*class语句的一般形式
    class ClassName(base):
        data = value        #定义数据属性
        def method(self,...):   #定义方法属性
            self.member = value

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

In [1]: class Testclass():      #定义类,类名首字母大写
   ...:     pass
   ...: 

In [2]: type(Testclass)         
Out[2]: classobj                #类对象

In [3]: obj1 = Testclass()      #实例化类

In [4]: type(obj1)
Out[4]: instance                #实例



(&)非常重要的例子

In [8]: class FirstClass():
   ...:     data = 'hello class'
   ...:     def printdata(self):
   ...:         print self.data
   ...:         

In [9]: insl = FirstClass()

In [10]: insl.
insl.data       insl.printdata  

In [10]: insl.data
Out[10]: 'hello class'

In [11]: insl.printdata
Out[11]: <bound method FirstClass.printdata of <__main__.FirstClass instance at 0x28b8f80>>

In [12]: insl.printdata()
hello class



In [19]: class SecClass():
   ....:     data = 'hello secClass'
   ....:     def printdata(self):
   ....:         print "Content from method : %s" %self.data
   ....:         

In [20]: ins2 = SecClass()

In [21]: ins2.data
Out[21]: 'hello secClass'

In [22]: ins2.printdata()
Content from method : hello secClass



*创建某个实例自有数据


In [23]: class ThirdClass():
   ....:     data = "hello ThirdClass"
   ....:     def setdata(self,x):
   ....:         self.str = x
   ....:     def printdata(self):
   ....:         print self.str
   ....:         

In [24]: ins4 = ThirdClass()

In [25]: ins4.data
Out[25]: 'hello ThirdClass'

In [26]: ins4.
ins4.data       ins4.printdata  ins4.setdata    

In [26]: ins4.setdata('abcd')

In [27]: ins4.printdata()
abcd

3.构造器 | (析构函数)

*在python创建初期,Python会自动调用类中的__init__方法,以隐形地为实例提供属性
(1)__init__方法被称为构造器
(2)如果类中没有定义__init__方法,实例创建之初,仅是一个简单的名称空间
(3)__varname__()双下划线开始的变量名,会被 python 解释器在某种情况下自动调用(a+b = a.__add__(b))


In [7]: class Myclass():
   ...:     data = 'hello Myclass'  | 类变量
   ...:     def __init__(self,x):
   ...:         self.str1 = x
   ...:         

In [9]: i1 = Myclass('zxd')

In [10]: i1.
i1.data  i1.str1  

In [10]: i1.data
Out[10]: 'hello Myclass'

In [11]: i1.str1
Out[11]: 'zxd'


(4)可使用类的__dict__字典属性或 Python 内置的 dir() 函数来获取类的属性


In [12]: Myclass.__dict__
Out[12]: 
{'__doc__': None,       #类的文档字串
 '__init__': <function __main__.__init__>,  
 '__module__': '__main__',  #类定义所在的模块
 'data': 'hello Myclass'}   #类自有的属性


(5)实例的特殊属性

4.类方法的可用变量

(1)实例变量:指定变量名称及实例自身进行引用
    self.变量名
(2)局部变量:方法内部创建的变量,可直接使用
(3)类变量(也称静态变量):通过指定变量名与类名进行引用
    类名.变量名

(4)全局变量:直接使用

5.继承

(1)继承描述了基类的属性如何“遗传”给派生类
    *子类可以继承它的基类的任何属性,包括数据属性和方法
    *一个未指定基类的类,其默认有一个名为object的基类
    *Python允许多重继承
(2)创建子类
    *创建子类时,只需要在类名后面跟一个或从其中派生的父类
    *class SubClassName(ParentClass1,[ParentClass2,..])
        'optional class documentaton string'
        class_suite
继承方法的专用化

(3)继承会先在子类寻找变量名,然后再查找父类,因此子类可以对父类的属性重新定义来取代继承而来的行为
    *子类可以完全取代从父类继承而来的属性
    *也可以通过已覆盖的方法回调父类来扩展父类的方法

6.类实例和其它对象的内建函数

(1) issubclass()
    *布尔函数,判断一个类是否由另一个类派生
    *语法:issubclass(sub,sup) 判断sub是不是属于sup

(2) isinstance()
    *布尔函数,判断一个对象是否是给定类的实例
    *语法:isinstance(obj1,class_obj2)  obj1是不是给定类的实例

In [1]: l1 = [1,2,3]

In [2]: isinstance(l1,list)
Out[2]: True


(3) hasatter()
    *布尔函数,判断一个对象是否拥有指定属性
    *语法:hasatter(obj,'attr')
    *同类的函数还有:getattr()|setattr()|delattr()

(4) super()
    *在子类中找出其父类以便于调用其属性
    *一般情况下仅能采用非绑定的方式调用祖先类方法
    *而super可用于传入实例或者类型对象
    *语法:super(type[,obj])

7.运算符重载

概述:运算符重载是指在方法中拦截内置的操作--当类的实例出现在内置操作中,Python会自动调用自定义的方法,并且返回自定义方法的操作结果
    *运算符重载让类拦截常规的Pythoon运算
        类可重载所有Python表达式运算
        类也可重复打印、调用函数、属性点号运算等内置运算
    *重载使类实例的行为像内置类型
    *重载通过提供特殊名称的类方法实现

运算符重载并非必要,并且通常也不是默认的

8.基于特殊的方法定制类

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值