Python 面向对象编程(进阶部分)

静态方法:

通过 @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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/278019.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享实录|争议不断地EOS,我们如何才能理性看待?

1 EOS基本介绍 EOS是Block.One公司正在研发的一个区块链底层公链系统&#xff0c;目的是解决现有的区块链应用性能低、安全性差、开发难度高以及过度依赖手续费的问题&#xff0c;实现分布式应用的性能扩展。EOS提供帐户&#xff0c;身份验证&#xff0c;数据库&#xff0c;异步…

Teams的Incoming Webhook

我在去年的一篇文章里介绍过Teams的outgoing webhook&#xff0c;这个可以用来实现一个简单的用户和service对话机制。 Teams除了outgoing webhook以外&#xff0c;还有一个incoming webhook&#xff0c;从名字上我们也可以立刻知道&#xff0c;这个webhook是用来处理进入Team…

Comet OJ - Contest #0题解

传送门 菜爆了……总共只有一道题会做的……而且也没有短裙好难过 为啥必须得有手机才能注册账号啊喂……歧视么…… \(A\) 解方程 推一下柿子大概就是 \[x-\sqrt{n}yz2\sqrt{yz}\] 如果\(\sqrt{n}\)是无理数&#xff0c;那么就是 \[xyz,{n\over 4}yz\] 那么要满足\(n\)必须是\…

tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册

tornado 08 数据库-ORM-SQLAlchemy-表关系和简单登录注册 引言 #在数据库&#xff0c;所谓表关系&#xff0c;只是人为认为的添加上去的表与表之间的关系&#xff0c;只是逻辑上认为的关系&#xff0c;实际上数据库里面的表之间并没有所谓的表关系 一、一对一表关系 Module #需…

Teams的manifest文件开始支持多语言

Teams发展速度飞快&#xff0c;Teams app的manifest文件schema也迎来了版本1.5&#xff0c;在这个版本里&#xff0c;很大的一个改进是支持多语言。 让我们一起来看看&#xff0c;如何在manifest文件里配置多语言。 1&#xff0c;我们需要先把manifest文件设置成v1.5 {"…

白白的(baibaide)

白白的&#xff08;baibaide&#xff09; 有一个长度为 $n$ 的序列 $a_1, a_2, \dots, a_n$&#xff0c;一开始每个位置都是白色。如果一个区间中每个位置都是白色&#xff0c;则称这是一个白白的区间。如果一个白白的区间向左或向右延长后都不是白白的区间了&#xff0c;则称这…

如何利用Python网络爬虫爬取微信朋友圈动态--附代码(下)

前天给大家分享了如何利用Python网络爬虫爬取微信朋友圈数据的上篇&#xff08;理论篇&#xff09;&#xff0c;今天给大家分享一下代码实现&#xff08;实战篇&#xff09;&#xff0c;接着上篇往下继续深入。一、代码实现1、修改Scrapy项目中的items.py文件。我们需要获取的数…

使用Adaptive cards来构建Teams app的界面

Teams app的task module十分好用&#xff0c;当用户点击了一个卡片上的按钮是可以在Teams里弹出一个对话框&#xff0c;对话框的内容可以是开发人员自己的一个网页页面&#xff0c;或者是adaptive card。 在我的LuckyDraw bot里&#xff0c;我比较了这两种的优势和劣势&#xf…

Boosting(提升方法)之GBDT

一、GBDT的通俗理解 提升方法采用的是加法模型和前向分步算法来解决分类和回归问题&#xff0c;而以决策树作为基函数的提升方法称为提升树&#xff08;boosting tree&#xff09;。GBDT(Gradient Boosting Decision Tree)就是提升树算法的一种&#xff0c;它使用的基学习器是C…

CC攻击原理及防范方法

一、 CC攻击的原理&#xff1a; CC攻击的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽&#xff0c;一直到宕机崩溃。CC主要是用来消耗服务器资源的&#xff0c;每个人都有这样的体验&#xff1a;当一个网页访问的人数特别多的时候&#xff0c…

Team photo的新api

Graph API的更新速度真是快&#xff0c;今年9月中旬又增加了关于Team photo的两个新的api。 https://docs.microsoft.com/en-us/graph/api/team-get-photohttps://docs.microsoft.com/en-us/graph/api/team-update-photo 今天就给大家介绍一下如何使用这两个新的api。 实际上说…

BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞

题意很简明吧&#xff1f; 枚举的矩形下边界和右端点即右下角&#xff0c;来确定矩形位置&#xff1b; 每一个纵列开一个单调队列&#xff0c;记录从 i-n1 行到 i 行每列的最大值和最小值&#xff0c;矩形下边界向下推移的时候维护一下&#xff1b; 然后在记录的每一列的最大值…

分享到Teams

在今年三月份末&#xff0c;Teams的官方文档推出了一个新功能&#xff1a;将网页&#xff08;一个URL&#xff09;分享到Teams里。 也就是说开发人员现在可以很方便的开发一个页面&#xff0c;页面里有一个Teams的图标&#xff0c;当访问此页面的最终用户点击这个图标后可以将…

xshell使用xftp传输文件和使用pure-ftpd搭建ftp服务

xshell使用xftp传输文件 首先安装xftp&#xff0c;然后建立会话&#xff0c;步骤和xshell一样&#xff0c;在使用的时候用CtrlALTf呼出&#xff0c;左边是windows桌面&#xff0c;右面是linux&#xff0c;双击或拖拽都可以实现命令互传。 使用pure-ftpd搭建ftp服务 首先安装yum…

MySQL命令行查询乱码解决方法

转自Agoly的博客&#xff0c;原文链接https://www.cnblogs.com/qmfsun/p/4846467.html 感谢博主Agoly这篇文章说的很详细很透彻。 MySQL会出现中文乱码的原因不外乎下列几点&#xff1a;1.server本身设定问题&#xff0c;例如还停留在latin1 2.table的语系设定问题(包含charact…

Teams Bot如何判断用户所在的时区

一说到时间&#xff0c;就会联想到时区&#xff0c;夏令时等头痛的问题&#xff0c;不同国家有不同国家的规定。如果你希望你的Teams Bot可以判断出当前用户所在的时区&#xff0c;从而可以针对性的进行一些处理时&#xff0c;你要做好心理准备&#xff0c;这个复杂程度远远超过…

『流畅的Python』第1~4章笔记_数据结构、编码

由于1~4章内容零散且基础&#xff0c;所以统计一下涉及到的内容&#xff0c;记录一下&#xff0c;方便查阅&#xff08;第一张图右键新页面打开即可看到清晰大图&#xff09;

docker 安装ELK

参考文档&#xff1a; Docker ELK使用文档&#xff1a;http://elk-docker.readthedocs.io/ 1.拉取镜像 查看 Docker Hub 的镜像 docker search elk 拉取镜像 sudo docker pull sebp/elk 2.启动容器 docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -p 4560:4560 -it --na…

在Teams Hackathon上介绍LuckyDraw

很荣幸有机会在今天的Teams Hackathon上介绍LuckyDraw这个teams app。 因为到场的都是各路开发高手&#xff0c;所以当时在准备这个ppt的时候特别增加了难度等级&#xff0c;哈哈。 从如何构建云原生的Teams app&#xff0c;到IaC&#xff0c;重点讲了如何开发一个面向全球用户…

Word 2010 制作文档结构之图标自动编号设置

注意&#xff1a; 使用图片自动编号时&#xff0c;如果文档标题使用的样式是通过“将所选内容保存为新快速样式”所生成的样式&#xff0c;则图片自动编号不会生效 因此设置标题样式时&#xff0c;不要 新建样式&#xff0c;直接使用word预设的“标题 1”样式和“标题 2”样式即…