Python 面向对象编程(进阶部分)
静态方法:
通过 @staticmethod 装饰器即可把其装饰的方法变为一个静态方法。普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类变量,但静态方法是不可以访问实例变量或类变量的,一个不能访问实例变量和类变量的方法,其实相当于跟类本身已经没什么关系了,它与类唯一的关联就是需要通过类名来调用这个方法
示例:
class Dog(object):
def __init__(self, name):
self.name = name
@staticmethod
def 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 @classmethod
def 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
@property
def 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
@property
def eat(self):
print("%s is eating" % self.name)
@eat.setter
def 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 = name
self.__food = None
@property
def eat(self):
print("%s is eating %s" % (self.name, self.__food))
@eat.setter
def eat(self, food):
print('The food is %s' % food)
self.__food = food
d = 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.deleter
def eat(self):
del self.__food
之后再调用 self.__food属性时就会报错,已经找不到了。
类的特殊成员方法:
1.__doc__:表示类的描述信息
class Dog(object):
'''这个类是用来描述狗这个对象的'''
def __init__(self):
pass print(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 C
obj = 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):
pass
def __call__(self, *args, **kwargs):
print('__call__')
obj = Foo() # 执行 __init__
obj() # 执行 __call__
Foo()()
输出结果:
__call__
__call__
6__dict__
通过类调用:查看类里的所有属性(不包括实例里的)
通过实例调用:查看实例里的所有属性(不包括类里的)
通过字典储存类中所有属性,绑定动态属性时也会在字典中添加相应项。占用内存较大,当存在大量实例时会占用大量资源,可以通过 '__slots__' 解决 <--点击查看
class Foo:
def __init__(self):
pass
def __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 = name
obj = Foo('A obj')
print(obj)
输出结果:
<__main__.Foo object at 0x0000024051A5F0F0>
如果加上__str__:
class Foo(object):
def __init__(self, name):
self.name = name
def __str__(self):
return '<obj:%s>' % self.name
obj = 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 = name
f = 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 obj def __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 = name print("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__
Python 面向对象编程(进阶部分)的更多相关文章
- python面向对象编程进阶
python面向对象编程进阶 一.isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 ...
- Python 面向对象编程进阶
静态方法 只是名义上归类管理,实际上在静态方法里访问不了类或实例中的任何属性 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在 ...
- 进击的Python【第七章】:Python的高级应用(四)面向对象编程进阶
Python的高级应用(三)面向对象编程进阶 本章学习要点: 面向对象高级语法部分 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 一.面向对象高级语法部分 静态方法 ...
- Day7 - Python基础7 面向对象编程进阶
Python之路,Day7 - 面向对象编程进阶 本节内容: 面向对象高级语法部分 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 Socket开发基础 作业:开发一个 ...
- 【转】python 面向对象(进阶篇)
[转]python 面向对象(进阶篇) 上一篇<Python 面向对象(初级篇)>文章介绍了面向对象基本知识: 面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 ...
- python 面向对象编程学习
1. 问题:将所有代码放入一个py文件:无法维护 方案:如果将代码才分放到多个py文件,好处: 1. 同一个名字的变量互相不影响 2.易于维护 3.引用模块: import module 2.包:解决 ...
- python 面向对象编程(一)
一.如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: class c ...
- Python面向对象编程指南
Python面向对象编程指南(高清版)PDF 百度网盘 链接:https://pan.baidu.com/s/1SbD4gum4yGcUruH9icTPCQ 提取码:fzk5 复制这段内容后打开百度网 ...
- Python面向对象编程(下)
本文主要通过几个实例介绍Python面向对象编程中的封装.继承.多态三大特性. 封装性 我们还是继续来看下上文中的例子,使用Student类创建一个对象,并修改对象的属性.代码如下: #-*- cod ...
随机推荐
- 近期Freecodecamp问题总结
最近没什么事,刷了freecodecamp的算法题,发现了自己基础的薄弱 1 where are thou 写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对( ...
- acm
给定一组数字,一组有9个数字,将这9个数字填写到3*3的九宫格内:使得横,竖,斜对角一条线上的三个数字之和相等:如果无解则打印无解: #include <iostream> #includ ...
- 5、SAMBA服务二:配置实例
①:SAMBA服务一:参数详解 ②:SAMBA服务二:配置实例 5.2.3.Samba共享目录配置实例 1.允许匿名用户读取/it共享目录,修改/etc/samba/smb.conf,在最后添加以下内 ...
- 【CUDA】Win10 + VS2017新 CUDA 项目配置
一.新建项目 打开VS2017 → 新建项目 → Win32控制台应用程序 → “空项目”打钩 二.调整配置管理器平台类型 右键项目 → 属性 → 配置管理器 → 全改为“x64” 三.配置生成属性 ...
- mysql查询出相同数据出现的次数,统计相同值的数量
1.可以使用count SELECT count(name='A' OR NULL) FROM table 2.用sum SELECT sum(if( = 'A', 1, 0)) FROM table ...
- 浅谈对象的两个方法:Object.keys() ,Object.assign();
1 : Object.keys(obj) 返回给定对象的所有可枚举属性的字符串数组 例子1: var arr = [1, 2, 6, 20, 1]; console.log(Object.keys(a ...
- bootstrap--------bootstrap table
bootstrap table 显示行号 <th rowspan="2" data-field="index" data-formatter=" ...
- 精确值避免使用float和double,使用BigDecimal
实现将double类型的值转换为BigDecimal类型的值的不同途径以及各途径间的区别 一:有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal ...
- 马凯军201771010116《面向对象程序设计(java)》第四周学习总结
第一部分:理论知识学习部分 第四章 1.类与对象的基础概念. 对象:即数据,对象有三个特性:行为 .状态.标识. 类是对象,事物的描述和抽象,是具有相同属性和行为的对象集合.对象则是该类事物的实例. ...
- python中Requests库错误和异常
主要有以下四种: 1.Requests抛出一个ConnectionError异常,原因为网络问题(如DNS查询失败.拒接连接等错误) 2.Response.raise_for_status()抛出一个 ...