静态方法:

通过 @staticmethod 装饰器即可把其装饰的方法变为一个静态方法。普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法

示例:

class Dog(object):def __init__(self, name):self.name = name@staticmethoddef eat_static(food):                  # 不能传入 self 否则会报错print(' is eating %s' % food)def eat(self, food):print('%s is eating %s' % (self.name, food))d = Dog('A dog')
d.eat_static('bone')                        # 调用静态方法
d.eat('bone')

输出结果:

is eating bone
A dog is eating bone

类方法:

类方法通过@classmethod装饰器实现,类方法和普通方法的区别是, 类方法只能访问类变量,不能访问实例变量

示例:

class Dog(object):name = 'Dog'                                # 类变量def __init__(self, name):self.name = name@classmethoddef eat_class(cls, food):                   # 不能传入 self 否则会报错print('%s is eating %s' % (cls.name, food))def eat(self, food):print('%s is eating %s' % (self.name, food))d = Dog('A dog')
d.eat_class('bone')                             # 调用类方法
d.eat('bone')

输出结果:

Dog is eating bone
A dog is eating bone

属性方法:

属性方法的作用就是通过 @property 把一个方法变成一个静态属性

简单使用示例:

class Dog(object):def __init__(self, name):self.name = name@propertydef eat(self):print("%s is eating" % self.name)d = Dog("A dog")
d.eat                                           # 调用属性(无法直接传参数),加括号会报错

输出结果:

A dog is eating

给属性方法赋值

示例:

class Dog(object):def __init__(self, name):self.name = name@propertydef eat(self):print("%s is eating" % self.name)@eat.setterdef eat(self, food):                        # 当给属性方法赋值时,调用这个方法print('The food is %s' % food)d = Dog("A dog")
d.eat
d.eat = 'bone'

输出结果:

A dog is eating
The food is bone

如果希望属性方法有参数,需要将参数存为类变量

示例:

class Dog(object):def __init__(self, name):self.name = nameself.__food = None@propertydef eat(self):print("%s is eating %s" % (self.name, self.__food))@eat.setterdef eat(self, food):print('The food is %s' % food)self.__food = foodd = Dog("A dog")
d.eat
d.eat = 'bone'
d.eat

输出结果:

A dog is eating None
The food is bone
A dog is eating bone

删除属性方法只需在上面函数的基础上再写一个:

@eat.deleterdef eat(self):del self.__food

之后再调用 self.__food属性时就会报错,已经找不到了。

类的特殊成员方法:

1.__doc__:表示类的描述信息

class Dog(object):'''这个类是用来描述狗这个对象的'''def __init__(self):passprint(Dog.__doc__)

输出结果:

这个类是用来描述狗这个对象的

2.__module__、 __class__

__module__ 表示当前操作的对象在那个模块

__class__     表示当前操作的对象的类是什么

lib\aa.py:

class C(object):def __init__(self, name):self.name = name

index.py:

from lib.aa import Cobj = C('name')
print(obj.__module__)
print(obj.__class__)

输出结果:

lib.aa

<class ’lib.aa.C’>

3.__init__:构造方法

4.__del__:析构函数

5.__call__:对象后面加括号,触发执行

注:构造方法的执行是由创建对象触发的,即:对象 = 类名() ;而对于 __call__ 方法的执行是由对象后加括号触发的,即:对象() 或者 类()()

class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print('__call__')obj = Foo()         # 执行 __init__
obj()               # 执行 __call__
Foo()()

输出结果:

__call__
__call__

6__dict__

通过类调用:查看类里的所有属性(不包括实例里的)

通过实例调用:查看实例里的所有属性(不包括类里的)

class Foo:def __init__(self):passdef __call__(self, *args, **kwargs):print('__call__')obj = Foo()
print(Foo.__dict__)
print(obj.__dict__)

输出结果:

{'__weakref__': <attribute '__weakref__' of 'Foo' objects>, '__module__': '__main__', '__init__': <function Foo.__init__ at 0x000001CED095D378>, '__dict__': <attribute '__dict__' of 'Foo' objects>, '__doc__': None, '__call__': <function Foo.__call__ at 0x000001CED3A9B510>}
{}

7.__str__:如果一个类中定义了__str__方法,那么在打印 对象 时,默认输出该方法的返回值

不使用__str__时:

class Foo(object):def __init__(self, name):self.name = nameobj = Foo('A obj')
print(obj)

输出结果:

<__main__.Foo object at 0x0000024051A5F0F0>

如果加上__str__:

class Foo(object):def __init__(self, name):self.name = namedef __str__(self):return '<obj:%s>' % self.nameobj = Foo('obj name')
print(obj)

输出结果:

<obj:A obj>

8.__getitem__、__setitem__、__delitem__

用于索引操作,如字典。以上分别表示获取、设置、删除数据

class Foo(object):def __getitem__(self, key):print('__getitem__', key)def __setitem__(self, key, value):print('__setitem__', key, value)def __delitem__(self, key):print('__delitem__', key)obj = Foo()result = obj['k1']      # 自动触发执行 __getitem__
obj['k2'] = 'name'      # 自动触发执行 __setitem__
del obj['k1']           # 自动触发执行 __delitem__

输出结果:

__getitem__ k1
__setitem__ k2 name
__delitem__ k1

9.__new__ 、__metaclass__

先看一段代码:

class Foo(object):def __init__(self, name):self.name = namef = Foo("name")
print(type(f))
print(type(Foo))

输出结果:

<class '__main__.Foo'>
<class 'type'>

所以,f对象是Foo类的一个实例Foo类对象是 type 类的一个实例,即:Foo类对象 是通过type类的构造方法创建

类默认是由 type 类实例化产生,type类中如何实现的创建类?类又是如何创建对象?

类中有一个属性 __metaclass__,其用来表示该类由 谁 来实例化创建,所以,我们可以为 __metaclass__ 设置一个type类的派生类,从而查看 类 创建的过程。

自定义元类:

class MyType(type):def __init__(cls, *args, **kwargs):print("Mytype __init__", *args, **kwargs)def __call__(cls, *args, **kwargs):print("Mytype __call__", *args, **kwargs)obj = cls.__new__(cls)print("obj ", obj, *args, **kwargs)print(cls)cls.__init__(obj, *args, **kwargs)return objdef __new__(mcs, *args, **kwargs):print("Mytype __new__", *args, **kwargs)return type.__new__(mcs, *args, **kwargs)print('here...')class Foo(object, metaclass=MyType):def __init__(self, name):self.name = nameprint("Foo __init__")def __new__(cls, *args, **kwargs):print("Foo __new__", cls, *args, **kwargs)return object.__new__(cls)f = Foo("Name")
print("f", f)
print("fname", f.name)

类的生成 调用 顺序依次是 __new__ --> __init__ --> __call__

转载于:https://www.cnblogs.com/dbf-/p/10649162.html

Python 面向对象编程(进阶部分)相关推荐

  1. Python开发系列课程(11) - 面向对象编程进阶

    面向对象编程进阶 在前面的章节我们已经了解了面向对象的入门知识,知道了如何定义类,如何创建对象以及如何给对象发消息.为了能够更好的使用面向对象编程思想进行程序开发,我们还需要对Python中的面向对象 ...

  2. Python面向对象编程:类继承和其衍生术语

    Python面向对象编程03:类继承和其衍生术语 前面我们讲到过正则表达式字符等,上一篇分享了面向对象编程和类的结构,最后稍微提到了继承. Python面向对象编程:深度认识类class_ Pytho ...

  3. 【Python基础】Python 面向对象编程(上篇)

    我的施工计划图 已完成专题包括: 1我的施工计划 2数字专题 3字符串专题 4列表专题 5流程控制专题 6编程风格专题 7函数使用专题 今天是面向对象编程的上篇:基础专题 Python 面向对象编程 ...

  4. Python零基础速成班-第10讲-Python面向对象编程(下),Property属性、特殊方法、设计模式、链表应用

    Python零基础速成班-第10讲-Python面向对象编程(下),Property属性.特殊方法.设计模式.链表应用 学习目标 面向对象编程 接上一讲:Property属性.特殊方法.设计模式 面向 ...

  5. 视频教程-彻底掌握Python面向对象编程-Python

    彻底掌握Python面向对象编程 曾就职于猎豹移动,从业已有8年,资深技术专家,现致力于线上教育 陈政强 ¥39.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 APP ...

  6. 这可能是Python面向对象编程的最佳实践

    作者 | 崔庆才 来源 | 进击的Coder(ID:FightingCoder) Python 是支持面向对象的,很多情况下使用面向对象编程会使得代码更加容易扩展,并且可维护性更高,但是如果你写的多了 ...

  7. 《Python面向对象编程指南》——1.2 基类中的__init__()方法

    本节书摘来自异步社区<Python面向对象编程指南>一书中的第1章,第1.2节,作者[美]Steven F. Lott, 张心韬 兰亮 译,更多章节内容可以访问云栖社区"异步社区 ...

  8. 关于python面向对象编程中、下列说法中_关于Python面向对象编程的知识点总结

    前言 如果你以前没有接触过面向对象的编程语言,那你可能需要先了解一些面向对象语言的一些基本特征,在头脑里头形成一个基本的面向对象的概念,这样有助于你更容易的学习Python的面向对象编程. 接下来我们 ...

  9. python对象编程例子-这是我见过最详细的Python面向对象编程!建议收藏!

    原标题:这是我见过最详细的Python面向对象编程!建议收藏! 面向对象编程和函数式编程(面向过程编程)都是程序设计的方法,不过稍有区别. 面向过程编程: 1. 导入各种外部库 2. 设计各种全局变量 ...

最新文章

  1. 这个机械装置真的能够分离彩色小球吗?
  2. c printf 缓冲区分析
  3. CNCC 技术论坛 | 知识图谱赋能数字经济
  4. IDEA webapp文件夹没有蓝色小圆点的解决方案
  5. TangerineWallpaper for Mac(高清橘子壁纸) 中文版
  6. Atitit.prototype-base class-based  基于“类” vs 基于“原型”
  7. qt将tablewidget导出为excel
  8. 常识——CE修改器使用
  9. 用户体验测试的心得体会
  10. 平面设计完全手册_工业时代的平面设计
  11. 数学建模-SARS疫情对某些经济指标影响例题
  12. 计算机无法进入操作系统怎么办,老司机教你电脑开机无法进入系统怎么办
  13. zen cart template zencart模板修改
  14. opencv获取摄像头的个数及名字
  15. Android 系统启动 <System server> 服务 [3]
  16. 工厂仪表定时拍照智能AI算法识别内网部署方案
  17. 如何解决Windows10启动QQ时报错无法访问个人文件夹?
  18. JS的变量,使用strict模式
  19. 1G1C 的云服务器能干嘛
  20. VOS的处理逻辑测试分析

热门文章

  1. php中改变函数路由,php – 如何修改codeigniter中的路由
  2. java 封装 继承 堕胎_Java的继承、封装和多态
  3. 腾讯测试鸿蒙系统,爆料:荣耀 30 Pro已开始测试华为鸿蒙系统
  4. db设计专用excel_工程师必备:硬件EMC设计规范
  5. 后端技术:JDK 8 Stream 数据流效率测试
  6. 为什么说嵌入式开发比单片机要难很多?
  7. Linux中Shell脚本函数库的笔记
  8. 浅说 XSS和CSRF
  9. java 开发注意项_JAVA开发注意事项集锦
  10. (七)整合spring cloud云服务架构 - common-service 项目构建过程