Python之路【第八篇】:Python基础(24)——面向对象进阶

参考连接:

Python 面向对象(初级篇)

http://www.cnblogs.com/wupeiqi/p/4493506.html

python 面向对象(进阶篇)

http://www.cnblogs.com/wupeiqi/p/4493506.html

python 面向对象及相关

http://www.cnblogs.com/wupeiqi/articles/5017742.html

面向对象进阶:

类成员之字段、方法、属性;

类成员修饰符;

类成员之特殊成员

1、类方法

普通的方法通过对象调用,至少有一个self参数(调用的时候系统自动传递,不需要手工传递),而类方法由类直接调用,至少有一个cls参数,执行时,自动将调用该方法的类赋值个cls

1 class Foo(object):
2     def __init__(self):
3         pass
4     @classmethod # 类方法装饰器,通过他把一个方法装饰成类方法
5     def class_func(cls): # cls参数就是这个类本身,注意与self不同,self表示类的对象本身
6         print(‘class_func‘, cls)
7 if __name__ == ‘__main__‘:
8     Foo.class_func()

2、静态方法

由类调用,没有默认参数

1 class Foo(object):
2     def __init__(self):
3         pass
4     @staticmethod # 静态方法装饰器,通过他把一个方法装饰成静态方法
5     def static_func(): # 与类方法不同的是没有默认参数cls
6         print(‘static_func‘)
7 if __name__ == ‘__main__‘:
8     Foo.class_func()

3、属性

由对象调用,除了self不能有其他参数,调用的时候不用(),看上去就像变量一样,但其实本质还是一个方法,可以通过return把一串执行过程的返回结果返回,从外面看就像是一个只读的变量

1 class Foo(object):
2     def __init__(self, count):
3         self.__count = count
4     @property # 属性装饰器,通过他把一个方法装饰成属性
5     def count(self):
6         return self.__count
7 if __name__ == ‘__main__‘:
8     obj = Foo(1)
9     print(obj.count) # 从外面调用的时候不用()看上去就像一个变量

属性的主要功能就是将内部复杂的逻辑计算得出的记过返回,所以建议最好有返回值,并且内部不要有print()否则虽然语法上不报错,并且的确没有啥问题,但失去了存在的意义。

到目前为止属性和变量相比还只是只读的,我们可以通过@属性名.setter装饰器定义一个修改属性的方法

 1 class Foo(object):
 2     def __init__(self, count):
 3         self.__count = count
 4     @property # 属性装饰器,通过他把一个方法装饰成属性
 5     def count(self):
 6         return self.__count
 7     @count.setter
 8     def count(self, value): # 这里除了self只能有一个参数
 9         self.__count = value
10 if __name__ == ‘__main__‘:
11     obj = Foo(1)
12     print(obj.count)
13     obj.count = 2 # 解释器会自动把赋值号后面的值作为参数传递给方法
14     print(obj.count)

另外变量还可通过del关键字进行销毁,属性同样可以

 1 class Foo(object):
 2     def __init__(self, count):
 3         self.__count = count
 4     @property # 属性装饰器,通过他把一个方法装饰成属性
 5     def count(self):
 6         return self.__count
 7     @count.setter
 8     def count(self, value): # 这里除了self只能有一个参数
 9         self.__count = value
10     @count.deleter
11     def count(self): # 这里除了self不能有其他参数
12         del self.__count
13
14 if __name__ == ‘__main__‘:
15     obj = Foo(1)
16     del obj.count # 解释遇到del关键字自动调用对应的deleter方法

到此,一个属性和变量的最大区别就只剩下变量就是一个变量而属性可以内部执行一大堆逻辑

4、成员修饰符

通过两个下划线“__”,修饰的都是私有,仅仅只是内部进行调用,并且不能继承(要特别注意,有中很贴切的说法形容私有,父亲的钱、房子儿子是共有的可以继承,父亲的女人是私有的,不可以继承),包裹类变量,实例变量,方法等都可以使用__修饰变成私有的

1 class Foo(object):
2     __name = ‘name‘ # 私有类变量
3     def __init__(self):
4         self.__age # 私有成员变量
5     def __funce(self): # 私有方法
6         pass

5、特殊成员

有一些成员不需要定义,解释器会自动加载,可以理解为这些都是继承自object

__init__:

构造方法,这里就不多说了,通过类创建对象时,自动触发执行

__doc__:

表示类的描述信息

1 class Foo(object):
2     ‘‘‘
3     类的描述信息
4     ‘‘‘
5     def __init__(self):
6         pass
7
8 if __name__ == ‘__main__‘:
9     print(Foo.__doc__)

__module__和__class__

__module__ 表示这个或对象属于哪个模块

__class__ 表示对象属于哪个类

 1 class Foo(object):
 2     ‘‘‘
 3     类的描述信息
 4     ‘‘‘
 5     def __init__(self):
 6         pass
 7
 8 if __name__ == ‘__main__‘:
 9     print(Foo.__module__)
10     obj = Foo()
11     print(obj.__class__)

__del__

析构方法,当对象在内存中销毁的时候自动触发执行

1 class Foo(object):
2     def __del__(self):
3         print(‘del object‘)
4
5 if __name__ == ‘__main__‘:
6     obj = Foo()

说明:Python解释器有自己的内存回收机制,这里当程序执行完了的是否触发析构方法,也可以使用del关键字手动销毁对象触发

__call__

在Python中,对象后面加括号,就会触发这个方法,如果没有这个方法就不可以。

1 class Foo(object):
2     def __call__(self):
3         print(‘__call__ is exec‘)
4
5 if __name__ == ‘__main__‘:
6     obj = Foo()
7     obj()

__dict__

类或者对象中的所有成员

 1 class Province(object):
 2     country = ‘China‘
 3
 4     def __init__(self, name):
 5         self.name = name
 6
 7     def func(self):
 8         pass
 9
10 if __name__ == ‘__main__‘:
11     print(‘Class dict:‘, Province.__dict__)
12     obj = Province(‘zhangsan‘)
13     print(‘Object dict:‘, obj.__dict__)

输出结果

1 Class dict: {‘__weakref__‘: <attribute ‘__weakref__‘ of ‘Province‘ objects>, ‘__module__‘: ‘__main__‘, ‘func‘: <function Province.func at 0x0000023BD2288950>, ‘country‘: ‘China‘, ‘__init__‘: <function Province.__init__ at 0x0000023BD22888C8>, ‘__dict__‘: <attribute ‘__dict__‘ of ‘Province‘ objects>, ‘__doc__‘: None}
2 Object dict: {‘name‘: ‘zhangsan‘}

说明:可以看出只有name是属于对象的,其他的都是属于类的,也就是说所有的方法都是属于类而不属于对象,当执行对象名.方法名()调用方法的时候,Python解释器会自动将对象本身作为方法的第一个参数传递给方法,也就是方法里self参数。

__str__

如果类中定义了一个__str__方法,当我们打印这个类的实例的时候回调用这个方法的返回值,所以这个方法必须有return,否则就会报错(TypeError: __str__ returned non-string (type NoneType))

1 class Foo(object):
2     def __str__(self):
3         return ‘Foo object‘
4
5 #class Foo()
6 if __name__ == ‘__main__‘:
7     obj = Foo()
8     print(obj)
时间: 2024-12-25 08:14:53

Python之路【第八篇】:Python基础(24)——面向对象进阶的相关文章

Python之路【第二篇】:Python基础(一)

Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1:     name = 'wupeiqi' print  name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 1 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result = 值2 三.进制 二进制,01 八进

Python之路【第九篇】:Python基础(26)——socket server

socketserver Python之路[第九篇]:Python基础(25)socket模块是单进程的,只能接受一个客户端的连接和请求,只有当该客户端断开的之后才能再接受来自其他客户端的连接和请求.当然我 们也可以通过python的多线程等模块自己写一个可以同时接收多个客户端连接和请求的socket.但是这完全没有必要,因为python标准库已经为 我们内置了一个多线程的socket模块socketserver,我们直接调用就可以了,完全没有必要重复造轮子. 我们只需简单改造一下之前的sock

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

Python之路番外:PYTHON基本数据类型和小知识点

Python之路番外:PYTHON基本数据类型和小知识点 一.基础小知识点 1.如果一行代码过长,可以用续行符 \换行书写 例子 if (signal == "red") and (car == "moving"): car = "stop" else : pass 等同于 if (signal == "red") and (car == "moving"): car = "stop"

Python之路【第一篇】:Python基础

本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语句 表达式for 循环 break and continue 表达式while 循环 作业需求 一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语

Python之路【第一篇:Python基础】

一:python的使用 1.python的两个版本:python2.0与python3.0.这两个版本的区别在于python3是不向下兼容python2的组件和扩展的,但是在python2.6和2.7的两个版本中将会继续兼容python2.0和3.0两个版本.简单点说就是python2.6与2.7是2.0版本向3.0版本的过渡版本,同时python的2.7版本也将是最后一个2.0版本,之后将全部使用python的3.0版本. Windows中python3.x的安装: 1 1.下载安装包 2 h

Python之路【第一篇】:Python前世今生

Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOBE排行榜,Python赶超PHP占据第五!!! 由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!! Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众

Python之路【第一篇】:初识Python

Python简介 Python前世今生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言的一种继承. 最新的TIOBE排行榜,Python赶超PHP占据第五!!! 由上图可见,Python整体呈上升趋势,反映出Python应用越来越广泛并且也逐渐得到业内的认可!!! Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众

Python开发【第八篇】:网络编程 Socket

Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: file模块是针对某个指定

Python开发【第八篇】:网络编程

Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字"向网络发出请求或者应答网络请求. socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭) socket和file的区别: fil