赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 编程语言

常用的编程语言
C#编程语言基础
C#面向对象与多线程
C#数据及文件操作
JavaScript基础
JavaScript的数据类型和变量
JavaScript的运算符和表达式
JavaScript的基本流程控制
JavaScript的函数
JavaScript对象编程
JavaScript内置对象和方法
JavaScript的浏览器对象和方法
JavaScript访问HTML DOM对象
JavaScript事件驱动编程
JavaScript与CSS样式表
Ajax与PHP
ECMAScript6的新特性
Vue.js前端开发
PHP的常量与变量
PHP的数据类型与转换
PHP的运算符和优先规则
PHP程序的流程控制语句
PHP的数组操作及函数
PHP的字符串处理与函数
PHP自定义函数
PHP的常用系统函数
PHP的图像处理函数
PHP类编程
PHP的DataTime类
PHP处理XML和JSON
PHP的正则表达式
PHP文件和目录处理
PHP表单处理
PHP处理Cookie和Session
PHP文件上传和下载
PHP加密技术
PHP的Socket编程
PHP国际化编码
MySQL数据库基础
MySQL数据库函数
MySQL数据库账户管理
MySQL数据库基本操作
MySQL数据查询
MySQL存储过程和存储函数
MySQL事务处理和触发器
PHP操作MySQL数据库
数据库抽象层PDO
Smarty模板
ThinkPHP框架
Python语言基础
Python语言结构与控制
Python的函数和模块
Python的复合数据类型
Python面向对象编程
Python的文件操作
Python的异常处理
Python的绘图模块
Python的NumPy模块
Python的SciPy模块
Python的SymPy模块
Python的数据处理
Python操作数据库
Python网络编程
Python图像处理
Python机器学习
TensorFlow深度学习
Tensorflow常用函数
TensorFlow用于卷积网络
生成对抗网络GAN


首页 > 专业技术 > 编程语言 > Python面向对象编程
Python面向对象编程

面向对象编程中的对象Object可以看作是对现实世界实体的模拟,一个Object被认为是把数据(属性)和程序(方法)封装在一起的实体。面向对象有多态、封装、继承特性。

1. 类和对象:

类对是现实中具有共同特征事物的抽象,是面向对象编程的基础。类包含名称、方法、属性和事件。
1)类的定义:
类必须使用class来定义,语法:
class classname(superclass, args):
    '''doc'''
data=value
def method1(self[,args]):
        pass
其中pass是占位符,替代由一系列的属性和方法组成的主体。类的方法中第一个参数一定要是self,代表类本身。但方法被调用时,不用传递这个参数。示例:
class Person:
    name="tom"
    def printName(self):
        print(self.name)
类的成员有两种,一种是数据成员,即属性;另一种是成员函数,称为方法。这样,类就把数据和操作封装在一起。访问类的属性时可以不创建类的实例,而直接使用类名。
2)类的创建和使用:
要使用类定义中的功能,需要将类实例化,即创建类的对象。Python中,用赋值方法创建类的实例。格式:
objectname=classname(args)
创建对象后,可以使用“.”来访问这个类的属性和方法。格式:
objectname.attribute
objectname.method()
比如实例化Person类:
p=Person()
name=p.name
p.printName()
3)类的属性:
类的属性分为私有属性和公有属性。Python语言中,私有属性的名称以双下划线开始,如果不以双下划线开始就为公有属性。
⑴访问私有属性:
私有属性不能被实例化对象访问,如果需要访问,要使用语法:
实例化对象名._类名__私有属性名
如:fly._Fly__direction
这种方法常用于开发阶段的测试和调试,而获得实例属性值的一般做法是定义get方法。
⑵数据属性:
数据属性不需要在类中预先定义,可在定义结束后通过类名添加。比如为Person类添加数据属性id:
Person.id='135786'
类的代码中并没有定义名称为id的属性,但实例化后可以直接使用,虽然类定义中并没有。
⑶实例属性:
实例属性不需要在类中显式定义,而是在__init__构造函数中定义的,定义时以self为前缀。在其他方法中也可以随意添加新的实例属性,但不提倡这样做。所有实例属性最好在__init__中给出。实例属性属于实例,也就是对象,只能通过对象名访问。示例:
class Car:
    def __init__(self,c):
        self.color=c
    def fun(self):
        self.length=1.83
代码中在构造函数中定义了实例属性self.color,在fun()方法中定义了实例属性self.length。
实例化类时需要传递__init__中的参数c:
car=Car('red')
然后就可以使用car.color属性:
print(car.color)
而使用了示例的方法fun()后:
car.fun()
然后就可以使用car.length属性
print(car.length)
⑷类属性:
类中定义的属性称为类属性,包括在类定义外添加的数据属性。示例:
class Person:
place='Shenzhen'
而要引用类属性,要使用类名,如果不是私有属性:
print(Person.place)
类实例化后,会产生一个与类属性同名的属性,但这个属性是属于实例的,如果修改此属性值,并不会影响类中的属性值。
p=Person()
print(p.place) # 显示Shenzhen
p.place='Qingdao'
print(p.place) # 显示Qingdao
print(Person.place) # 显示Shenzhen
以实例(对象)名引用此属性,引用的也是实例的属性值,而会屏蔽类的属性值,除非删除了实例的属性。
del p.place
print(p.place) # 显示Shenzhen
⑸类的内置属性:
Python对类提供了一些内置属性,所有的类都有这些内置属性。
·__name__属性:表示类名
·__doc__属性:用来输出类的文档字符串doc
·__module__属性:表示所在的模块名
·__bases__属性:为基类组成的元组
·__dict__属性:为属性组成的字典
4)类的方法:
类的方法是对象具有的行为,也分公有方法和私有方法,以双下划线开头的为私有方法,不是以双下划线开头的方法为公有方法。
⑴类方法:
类方法使用@classmethod指令来声明,第1个参数必须是类对象,一般使用cls。类方法隐含调用的参数是类,类方法常用来对类属性进行修改。示例:
class Person:
    place='Shenzhen'
    @classmethod
    def getPlace(cls):
        return cls.place
⑵实例方法:
实例方法是平常定义的成员方法,它至少有一个参数且必须以实例对象为其第1个参数,一般使用self。在类外面使用实例方法只能通过实例对象来调用。
⑶静态方法:
静态方法需要通过@staticmethod指令方式定义,其中并不需要使用self或cls作为第1个参数,只需要定义必要的其他参数。示例:
class Methods:
    @staticmethod
    def mymethod():
        print('定义的静态方法')
    def __mymethod():
        print('定义的私有方法')
    def getMethod(self):
        print('普通的方法')
    conPrivate=staticmethod(__mymethod)
    conNormal=staticmethod(getMethod)
代码中,Method类中定义了静态方法mymethod、私有方法__mymethod和普通方法getMethod,然后使用函数staticmethod()将私有方法__mymethod转换为静态方法conPrivate,将普通方法getMethod转换为静态方法conNormal。
静态方法中可以使用类,也可以使用实例化对象来访问,但不能直接访问私有方法,否则会出现异常。
5)内置方法:
Python中,类都有一些内置特殊方法,这些方法都以双下划线开头,并以双下划线结尾,具有特殊作用。如果这些方法被定义,遇到相应场合就会自动调用:

内置方法

说明

__new__(cls, *args)

定义实例的生成操作,如果返回cls则__init__被调用,并将args参数传递给__init__;否则__init__不被调用

__init__(self, args)

定义初始化对象的方法,在创建新对象前自动调用

__del__(self)

定义释放对象时的操作,在对象被删除前自动调用

__str__(self)

定义在使用print语句时的调用方法,为了可读

__repr__(self)

定义在使用print语句时的调用方法,保证eval(repr(c))==c

__cmp__(self, other)

定义比较两个对象self和other的方法

__index__(self)

定义任何对象作为整数下标的方法,必须返回一个整数或者长整数

__gt__(self, other)

定义类的实例比较self>other时的方法

__lt__(self, other)

定义类的实例比较self<other时的方法

__ge__(self, other)

定义类的实例比较self>=other时的方法

__le__(self, other)

定义类的实例比较self<=other时的方法

__eq__(self, other)

定义类的实例比较self==other时的方法

__ne__(self, other)

定义类的实例比较self!=other时的方法

__hash__(self)

定义类的实例调用hash()时的行为,返回一个整数

__nonzero__(self)

定义类的实例调用bool()时的行为

__getattr__(self, name)

当属性查找没有找到name时调用的方法

__getattribute__(self, name)

只要属性名被访问就会调用的方法

__setattr__(self, name, value)

当设置属性值时调用的方法,内部使用self.__dict__[name]=value

__delattr__(s, name)

删除属性时调用的方法

__len__(self)

在调用内联函数len()时调用的方法

__call__(self, *args, **kwargs)

把实例对象作为函数调用时的方法

__delitem__(self, key)

从字典中删除key对应的元素

__setitem__(self, key, value)

为字典中的key赋值

__getitem__(self, key)

获取序列的索引key对应的值,等价于seq[key]

⑴__init__方法:构造方法
__init__方法是Python中的构造函数,在生成对象时自动调用,用来进行初始化操作。如果用户没有定义构造方法,系统会自动执行默认的构造方法。__init__()方法没有返回值。
⑵__del__方法:析构方法
__del__方法的作用是释放被占用的资源,在释放对象时自动调用。
⑶__new__方法:
__new__方法在创建对象时被调用。实际上,__init__方法在创建完对象之后才被调用,而__new__方法则是在创建对象时被调用。一般__new__()方法要有返回值,返回一个实例,这样会自动调用__init__()方法初始化实例。
⑷__setitem__方法:
__setitem__方法是简单地重定向到真正的字典self.data。
⑸__getitem__方法:
__getitem__方法是重定向到字典,返回的是字典的值。
⑹__delitem__方法:
__delitem__方法是在调用del 实例对象[key]时调用
⑺__cmp__方法:
__cmp__方法定义比较两个实例对象的方法,当用==比较类实例时会使用此方法。
除上述类的特殊方法,Python还支持一些运算符的重载。示例:
class C(object):
    def __init__(self,v):
        self.value=v  
    def __add__(self,r):
        return self.value+r  
类的定义中重载了__add__方法,这样就开始使用加法操作:
a=C(10)
print(a+1) # 相当于调用了a.__add__(1)
6)类的动态特性:
Python是面向对象的动态语言,可以动态添加类的方法,将某个已经定义的方法添加到类中。语法:
class_name.method_name=exist_name
实例:
class Yesterday(object):
    pass
def today(self):
    print(珍惜今天'')
if __name__=='__main__':
    Yesterday.yesterday=today
    yes=Yesterday()
    yes.yesterday()
上述代码,将创建的方法today添加到类Yesterday中。

2. 继承:

继承是指一个对象直接使用另一个对象的属性和方法。被继承的类称为父类或超类,继承了父类或超类的所有数据和操作的类称为子类。继承的语法:
class class_name(fatherclass_name)
也即,在类名后面紧跟一对小括号,括号中指定所继承的父类。继承关系中,子类继承了父类的所有公有属性和方法,如果子类未重载父类的方法和属性,子类的实例将调用父类的属性和方法。子类中重载了父类的属性或方法,也可以使用super来调用父类中的方法。但子类不会继承父类的私有属性和方法。
Python中没有抽象类的关键字,可以通过NotImplementedError类来模拟抽象类,使其在实例化时抛出异常。也可以在父类中的抽象方法中使用raise语句抛出异常,以使子类必须重载相应的方法。
Python提供了多重继承的方法。语法:
class class_name(fatherclass_name, fatherclass_name1, ...)
Python 3.x中,如果多继承的子类重新定义了构造方法,需要显式去调用父类的构造方法,调用哪个父类的构造方法由程序决定。若子类没有重新定义构造方法,则只会执行第1个父类的构造方法,如果其他父类有同名的方法,通过子类的实例化对象调用该方法时,调用的是第1个父类中的方法。
Python中提供了函数issubclass(sub,sup)用来判断类sub是否为类sup的子类或子孙类,其中sup可以为父类组成的元组。

3. 类的其他特性:

1)类的命名空间
在Python中,定义类时,所有位于class语句中的代码都在特殊的命名空间中执行,被称为类命名空间(class namespace)。这个类命名空间不仅可以被类中所有成员访问,还可以被类的实例方法访问。
2)检查继承关系:
Python提供内建issubclass函数来判断两个类是否有继承关系,也可以用来判断一个对象是否是一个类的实例。示例:
print(issubclass(Ordinary, Person)
print(issubclass(person, Person)
3)检查实例与对象间的关系:
实例与类之间的对应关系可通过isinstance()函数来判断。语法:
isinstance(objectname, classname)
4)对象属性操作方法:
Python提供了一系列函数用于对对象属性进行操作:
·getattr(obj, attr):读取对象的属性,其中attr要使用表示属性的字符串,即用引号括起来
·setattr(obj, attr, value):设置对象的属性
·delattr(obj, attr):删除对象的属性
·hasattr(obj, attr):检测对象是否有属性

4)新式类:

新式(new-style)类是指从object或者其他内置类衍生的类,而其他类则称为经典(classic)类。新式类多了一些高级功能。
1)__slots__属性:
任何类的实例对象都包含一个字典__dict__,但字典会占用大量内存,可以使用__slots__来代替。__slots__是一个类变量,可由一系列对象组成,使用所有合法标识构成的实例属性的集合来表示,它可以是一个列表、元组或可迭代对象。
一般情况下,__slots__属性在class语句顶层设置:
class MyLimeter(object)
    __slots__='myname','myage','myhoppy'
2)__getattribute__()方法:
这个方法仅当属性不能在实例的__dict__、类的__dict__或者__dict__中找到时才被调用。
3)描述符:
描述符为对象属性提供API,就是将某种特殊类型的类的实例指派给另一个类的属性。这个特殊的描述符类是一种新式类,包含的方法有__get__()、__set__()和__delete__(),其中__get__()方法用于得到一个属性的值,__set__()方法为一个属性赋值,而__delete__()方法则是在采用del语句或者明确删除某个属性时被调用。三种方法的原型为:
def __get__(self, obj, typ=None)
def __set__(self, obj, val)
def __delete__(self, obj)

5. 抽象基类:

Python的abcmk提供了定义抽象基类的方法,这种类为其子类定义了一组公共接口,这些接口在子类中必须加以实现。与抽象基类相关的概念是元类,元类像一个类工厂,返回对象是类。
type函数可动态创建类,接受一个类的描述符作为参数,然后返回一个类。语法:
type(classname,(superclass,),attrdict(name1=value1,...))
其中,(superclass,)是一个父类的元组,针对继承情况,可为空;attrdict是包含属性的字典,其中使用name=value的格式定义多个属性值。
函数type实际上是一个元类,也就是用于创建类的类。

 

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659