cndaqiang Web Linux DFT

python(三)对象

2017-09-29
cndaqiang
RSS

参考

简明python教程

Python3教程-菜鸟教程

20170812PHP学习(一)基础语法

一篇文章让你彻底搞清楚Python中self的含义

概念

关于对象的关系概念可以参考20170812PHP学习(一)基础语法中的部分,在学php时我已经对对象有些了解了,概念部分就随便参考了-.-

类和对象 类似c语言的结构体

  • 类 是对象的格式(模板),规定了具体哪些属性(变量)和方法(函数)
  • 对象 类的具体化,基于类创建的一种类型

如果以汽车对比的话如图,不过我感觉学过c语言结构体的人马上就懂了

向我们前面说的,定义list类型的对象,如list0=[1,2,3]可以使用list0.append()来使用类中方法(函数)

这里list就是类,list0就是对象,类中定义了方法(函数)属性(变量),如append()就是一个方法

>>> list0=[1,2,3]
>>> list.append(4)
>>> list0.append(4)
>>> list0
[1, 2, 3, 4]

常用概念

  • 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。
  • 类变量:类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用。就是类里面定义的变量
  • 实例变量:定义在方法中的变量,只作用于当前实例的类。
  • 方法:类中定义的函数。
  • 数据成员:类变量或者实例变量用于处理类及其实例对象的相关的数据。
  • 继承:即一个派生类(derived class)继承基类(base class)的字段和方法。继承也允许把一个派生类的对象作为一个基类对象对待。例如,有这样一个设计:一个Dog类型的对象派生自Animal类,这是模拟”是一个(is-a)”关系(例图,Dog是一个Animal)。
  • 方法重写:如果从父类继承的方法(函数)不能满足子类的需求,可以对其进行改写,这个过程叫方法的覆盖(override),也称为方法的重写
  • 实例化:创建一个类的实例,类的具体对象。创建一个类的对象
  • 对象:通过类定义的数据结构实例。对象包括两个数据成员(类变量和实例变量)和方法

下面正式开始走心记笔记

定义

注意缩进和冒号

类的方法(函数)

在类地内部,使用 def关键字来定义一个方法,与一般函数定义不同,类方法必须包含参数,惯例第一个参数名为self, 也可自定义为其他,但一定要有,还是用惯例吧

以下内容默认第一个参数名为self,self 代表的是类的实例/对象,无参数定义def fun():时,使用对象.fun(),会将对象的性质传给fun的第一个参数self,函数无参时没法接收这个参数,报错

关于self

self只在定义函数时出现,只在函数内部使用,参数每个函数都可自定义,以下默认类内所有的方法第一个参数都为self

  • 在类实例化生成对象时,self自动指向为对象的地址,self等价于对象名
  • 可在方法内用self.变量/函数来调用对象中的其他变量/函数(私有或非私有)

类内未定义的变量,在函数内使用self.变量名=值定义的变量编译时可能不出错,后期不知道会不会出问题,别这样用

类的属性(变量)

正常

类的私有方法

__private_method两个下划线开头,声明该方法为私有方法,只能在类的内部调用 ,不能在类的外部调用,

类的私有属性

__private_attrs两个下划线开头,声明该属性为私有,不能在类地外部被使用或直接访问。

关于私有

私有方法/属性与正常的方法和属性区别仅在于能使用的范围不同,命名方式的不同,在类内的调用方法一样 私有的名称包括__ 如:若定义方法的参数为def fun(self)则方法内使用self.方法/属性名调用方法/属性,方法/属性名为私有或共有的都可以

我之前学习的误区self和私有非私有是没有联系的概念,self与私有与self与非私有的使用没有什么异同

继承类的定义

基类/父类正常定义 子类定义

class 子类/派生类名(基类/父类1,基类/父类2,基类/父类3)
  • 子类支持多继承,之多个父类之间用逗号隔开
  • 子类中定义了和父类中相同的方法/属性为重写,调用子类时以子类中定义使用,对父类无影响,即方法重写
  • 子类中未定义的方法/属性,从左向右在父类中检查
  • 基类/父类1可为与子类需在同一作用域内的类,或为某一模块内的类模块.类
class 类名:
 变量=值
 def 方法/函数名():
  函数体

如,抛出异常的示例

#定义类ShortInputException,其父类为Exception
 class ShortInputException(Exception):
        '''你定义的异常类。'''
#初始化
        def __init__(self, length, atleast):
            Exception.__init__(self)
            self.length = length
            self.atleast = atleast
#之后的内容为抛出异常捕获异常的代码
    try:
        s = raw_input('请输入 --> ')

        if len(s) < 3:
            # raise引发一个你定义的异常
            raise ShortInputException(len(s), 3)

    except EOFError:
        print '/n你输入了一个结束标记EOF'
    except ShortInputException, x:#x这个变量被绑定到了错误的实例
        print('ShortInputException: 输入的长度是 %d,长度至少应是 %d'% (x.length, x.atleast))
    else:
        print '没有异常发生.'

使用

类对象支持两种操作:属性引用和实例化。

  • 属性引用使用和 Python 中所有的属性引用一样的标准语法:obj.name。
  • 类对象创建后,类命名空间中所有的命名都是有效属性名
  • 类和对象的私有方法和函数都不能在外部以xx.xx方式使用

属性引用

>>> print(lei.a)
2
>>> lei.fun()
hello

实例化类-对象

>>> x=lei()
>>> x.fun()
hello

self示例

class lei():
 __siyou=5
 def fun(sef):    #推荐self,使用自定义如sef也行,之后就使用sef.xxx调用
  print(sef.__siyou)
  print(sef)
 num=__siyou+1    #方法外调用私有,直接写私有名称
x=lei()
x.fun()
print(x.num)

运行

$ python3 self.py 
5
<__main__.lei object at 0x7fe8e909da90>     #可以看到self代表类lei的一个对象(object),地址0x7fe8e909da90,
6

类的专有方法

__init__ : 构造函数,在生成对象时调用
__del__ : 析构函数,释放对象时使用
__repr__ : 打印,转换
__setitem__ : 按照索引赋值
__getitem__: 按照索引获取值
__len__: 获得长度
__cmp__: 比较运算
__call__: 函数调用
__add__: 加运算
__sub__: 减运算
__mul__: 乘运算
__div__: 除运算
__mod__: 求余运算
__pow__: 乘方

构造函数__init__

def __init__(self,其他参数逗号隔开):
 函数体

定义对象时括号内的参数,传递给__init__(self,其他参数逗号隔开)中self后面的参数

x=lei(参数用逗号隔开)

析构函数__del__

没有啥特殊的


本文首发于我的博客@cndaqiang.
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!



评论


广告

目录

广告
访客数据