成员

类成员:

  • 类变量
  • 绑定方法
  • 静态方法
  • 类方法
  • 属性

实例(对象)成员: 实例变量

1 实例变量

实例变量(又叫做:字段/属性)

2 类变量

类变量(又叫做:静态字段/属性)

定义:写在类的下一级和方法同一级。

访问:

    1. 类.类变量名称
    2. 对象.类变量名称

练习题:

class Base:
x = 1 obj = Base() print(obj.x) # 先去对象中找,没有再去类中找。
obj.y = 123 # 在对象中添加了一个y=123的变量。
print(obj.y)
obj.x = 123 # 在对象中添加了一个x=123的变量。(不可以修改类中的变量)
print(obj.x)
print(Base.x)
Base.x = 666 # 类可以修改类中的变量 x = 666
class Parent:
x = 1 class Child1(Parent):
pass class Child2(Parent):
pass print(Parent.x,Child1.x,Child2.x) # 1 1 1
Child1.x = 2
print(Parent.x,Child1.x,Child2.x) # 1 2 1
Child2.x = 3
print(Parent.x,Child1.x,Child2.x) # 1 2 3

总结:

找变量优先找自己,自己没有找类或基类;修改或赋值只能在自己的内部设置。

3 方法(绑定方法/普通方法)

定义:至少有一个self参数

执行:先创建对象,由对象.方法()

class Foo:
def func(self,a,b):
print(a,b) obj = Foo()
obj.func(1,2)
# ###########################
class Foo:
def __init__(self):
self.name = 123 def func(self, a, b):
print(self.name, a, b) obj = Foo()
obj.func(1, 2)

用到对象中封装值时,一般使用绑定方法。

4 静态方法

定义:

  • @staticmethod装饰器
  • 参数无限制

执行:

  • 类.静态方法名 ()
  • 对象.静态方法名 ()(不推荐使用:因为没有意义)
class Foo:
def __init__(self):
self.name = 123 def func(self, a, b):
print(self.name, a, b) @staticmethod # python中内置的,只需调用就可以用
def f1():
print(123) obj = Foo()
obj.func(1, 2) Foo.f1() # 可以不用传参数,只需调用
obj.f1() # 不推荐

5 类方法

定义:

  • @classmethod装饰器
  • 至少有cls参数,当前类。

执行:

  • 类.类方法()
  • 对象.类方法() (不推荐)
class Foo:
def __init__(self):
self.name = 123 def func(self, a, b):
print(self.name, a, b) @staticmethod
def f1():
print(123) @classmethod
def f2(cls,a,b):
print('cls是当前类',cls)
print(a,b)
obj = Foo()
obj.func(1, 2) Foo.f1()
Foo.f2(1,2)

@classmethod和@staticmethod的区别?

  • 一个是类方法一个静态方法。
  • 定义:

    类方法:用@classmethod做装饰器且至少有一个cls参数。

    静态方法:用staticmethod做装饰器且参数无限制。
  • 调用:

    类.方法直接调用。

    对象.方法也可以调用。

6 属性

在一个方法上加@property,方法就变成了属性,调用时不用加()。

定义:

  • @property装饰器
  • 只有一个self参数

执行:对象.方法 不用加括号。

class Foo:

    @property
def func(self):
print(123)
return 666 obj = Foo()
result = obj.func
print(result)
# 属性的应用

class Page:
def __init__(self, total_count, current_page, per_page_count=10):
self.total_count = total_count
self.per_page_count = per_page_count
self.current_page = current_page
@property
def start_index(self):
return (self.current_page - 1) * self.per_page_count
@property
def end_index(self):
return self.current_page * self.per_page_count USER_LIST = []
for i in range(321):
USER_LIST.append('alex-%s' % (i,)) # 请实现分页展示:
current_page = int(input('请输入要查看的页码:'))
p = Page(321, current_page)
data_list = USER_LIST[p.start_index:p.end_index]
for item in data_list:
print(item)

7 特殊成员

7.1 __init__

初始化方法,用于给对象中赋值。

class Foo:
"""
类是干啥的。。。。 # 注释类
"""
def __init__(self,a1):
"""
初始化方法
:param a1:
"""
self.a1 = a1 obj = Foo('alex')

7.2 __new__

用于创建空对象,又叫构造方法

class Foo(object):
def __init__(self):
"""
用于给对象中赋值,初始化方法
"""
self.x = 123
def __new__(cls, *args, **kwargs):
"""
用于创建空对象,构造方法
:param args:
:param kwargs:
:return:
"""
return object.__new__(cls) obj = Foo()

类实例化一个对象:先执行__new__创建一个空对象,再执行__init__初始化对象

7.3 __call__

对象后面加(),就可以执行python的一个方法:__call__方法

class Foo(object):
def __call__(self, *args, **kwargs):
print('执行call方法') obj = Foo()
obj() =====> Foo()()
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from wsgiref.simple_server import make_server def func(environ,start_response):
start_response("200 OK", [('Content-Type', 'text/plain; charset=utf-8')])
return ['你好'.encode("utf-8") ] class Foo(object): def __call__(self, environ,start_response):
start_response("200 OK", [('Content-Type', 'text/html; charset=utf-8')])
return ['你<h1 style="color:red;">不好</h1>'.encode("utf-8")] # 作用:写一个网站,用户只要来方法,就自动找到第三个参数并执行。
server = make_server('127.0.0.1', 8000, Foo())
server.serve_forever()

7.4__getitem__ __setitem__ __delitem__

class Foo(object):

    def __setitem__(self, key, value):
pass def __getitem__(self, item):
return item + 'uuu' def __delitem__(self, key):
pass obj1 = Foo()
obj1['k1'] = 123 # 内部会自动调用 __setitem__方法
val = obj1['xxx'] # 内部会自动调用 __getitem__方法
print(val)
del obj1['ttt'] # 内部会自动调用 __delitem__ 方法

7.5 __str__

class Foo(object):
def __str__(self):
"""
只有在打印对象时,会自动化调用此方法,并将其返回值在页面显示出来
:return:
"""
return 'asdfasudfasdfsad' obj = Foo()
print(obj)
class User(object):
def __init__(self,name,email):
self.name = name
self.email = email
def __str__(self):
return "%s %s" %(self.name,self.email,)
user_list = [User('二狗','2g@qq.com'),User('二蛋','2d@qq.com'),User('狗蛋','xx@qq.com')]
for item in user_list:
print(item)

注意:不要相信print打印出来的(显示出来的不一定是字符串,也可能是类实例化的对象)

7.6 __dict__

class Foo(object):
def __init__(self,name,age,email):
self.name = name
self.age = age
self.email = email obj = Foo('alex',19,'xxxx@qq.com')
print(obj)
print(obj.name)
print(obj.age)
print(obj.email)
val = obj.__dict__ # 去对象中找到所有变量并将其转换为字典
print(val)

7.7 上下文管理

class Foo(object):
def __enter__(self): # 打开文件
self.x = open('a.txt',mode='a',encoding='utf-8')
return self.x
def __exit__(self, exc_type, exc_val, exc_tb): # 关闭文件
self.x.close() with Foo() as ff:
ff.write('alex')
ff.write('alex')
ff.write('alex')
ff.write('alex')
# 练习题
# 方法1
class Context:
def __enter__(self):
print('进入')
return self def __exit__(self, exc_type, exc_val, exc_tb):
print('推出') def do_something(self):
print('内部执行') with Context() as ctx:
print('内部执行')
ctx.do_something() # 方法二
class Foo(object):
def do_something(self):
print('内部执行') class Context:
def __enter__(self):
print('进入')
return Foo() def __exit__(self, exc_type, exc_val, exc_tb):
print('推出') with Context() as ctx:
print('内部执行')
ctx.do_something()

注:只要有with就要用到__enter____exit__这两个方法

7.8 两个对象相加 __add__

val = 5 + 8
print(val) val = "alex" + "sb"
print(val) class Foo(object):
def __add__(self, other):
return 123 # __add__是由obj1触发的,self是obj1,other是obj2,返回的值给val. obj1 = Foo()
obj2 = Foo()
val = obj1 + obj2
print(val)

7.9 可迭代对象 __iter__

表象:可以被for循环的对象就可以称之为是可迭代对象,如:'ax'、[1,2,3]、[]

如何让一个对象变成可迭代对象?

在类中实现__iter__方法且返回一个迭代器(或生成器)。

class Foo:
def __iter__(self):
return iter([1,2,3,4]) obj = Foo() class Foo:
def __iter__(self):
yield 1
yield 2
yield 3 obj = Foo()

记住:只要能被for循环就是去看它内部的iter方法。

总结:

特殊成员:就是为了能够快速实现执行某些方法而生。

python day11 函数(第三篇)的更多相关文章

  1. Python之函数第三篇

    一.匿名函数 匿名函数是lambda定义的没有名字的具有一些小功能的函数 具体形式是 lambda x: X**2 # 求平方操作 lambda x: x>100 # 判断参数是否大于100 二 ...

  2. 初学Python——文件操作第三篇

    一.引言 什么?有了第二篇文件操作还不够?远远不够!而且在读完第三篇文件操作还是不够.关于文件的操作,后续的学习中将不断学习新的操作方式,使用更加合适的方法. 进入正题,上一篇讲到,Python对文件 ...

  3. 跟着老男孩教育学Python开发【第三篇】:Python函数

    set 无序,不重复,可嵌套. 函数 创建函数: 1.def关键字,创建函数 2.函数名 3.() 4.函数体 5.返回值 发邮件函数 def sendmail():     import smtpl ...

  4. Python自动化 【第三篇】:Python基础-集合、文件操作、字符编码与转码、函数

    1.        集合 1.1      特性 集合是一个无序的,不重复的数据组合,主要作用如下: 去重,把一个列表变成集合实现自动去重. set可以看成数学意义上的无序和无重复元素的集合,因此,两 ...

  5. Python开发【第三篇】:函数&读写文件

    三元运算 三元运算,是条件语句的简单的写法.如果条件为真,则返回值1,否则,返回值2. ret = 值1 if 条件 else 值2 深浅拷贝 对于数字(int)和字符串(str)而言,赋值.深拷贝. ...

  6. Python开发【第三篇】:Python函数

    set     无序,不重复,可嵌套. 函数     创建函数:     1.def关键字,创建函数     2.函数名     3.()     4.函数体     5.返回值 发邮件函数 def ...

  7. Python【基础第三篇】

    set集合 s1=set() 集合特点: 访问速度快 没有重复项 collections系列(数据类型容器模块) 一.计数器(Counter) Counter是对字典类型的补充,用于追踪值的出现次数. ...

  8. Python 基础【第三篇】输入和输出

    这里我们创建一个python(pytest)脚本用于学习测试(以后都为这个文件,不多做解释喽),这个文件必须要有执行权限的哈 1.创建pytest并赋予执行权限 [root@fengyuba_serv ...

  9. python基础-------函数(三)

    迭代器 一.迭代的概念 迭代:1 重复2 下一次重复是基于上一次的结果 l=['a','b','c','d'] count=0while count < len(l): print(l[coun ...

随机推荐

  1. Android学习笔记-事件处理

    第三章 Android的事件处理 Android提供两种事件处理方式,基于回调和基于监听器.前者常用于传统图形界面编程中,而后者在AWT/Swing开发中常用. 3.1 事件处理概述 对于基于回调的事 ...

  2. mysql导入sql文件出错的一种解决方法

    转:https://blog.csdn.net/u011806486/article/details/60147358 本人在本地使用navicat for mysql可以连接到服务器数据库,但是从服 ...

  3. ThinkPhp框架分页查询和部分框架知识

    一.一个条件的查询数据 查询数据自然是先要显示出数据,然后根据条件进行查询数据 (1)显示出表的数据 这个方法我还是写在了HomeController.class控制器文件中 (1.1)写了一个方法s ...

  4. 使用 JavaScript 拦截和跟踪浏览器中的 HTTP 请求

    HTTP 请求的拦截技术可以广泛地应用在反向代理.拦截 Ajax 通信.网页的在线翻译.网站改版重构等方面.而拦截根据位置可以分为服务器端和客户端两大类,客户端拦截借助 JavaScript 脚本技术 ...

  5. 配置中心Nacos

    Nacos 是阿里巴巴2018年7月份开源的项目,如其名, Naming Configuration Service ,专注于服务发现和配置管理领域. Nacos 是什么?上面已经大概介绍了,更多详细 ...

  6. (最详细)小米Note 2的usb调试模式在哪里开启的教程

    当我们使用安卓手机链接Pc的时候,或者使用的有些工具比如我们学院营销团队当使用的工具引号精灵,之前使用的老版本就需要开启USB开发者调试模式下使用,现当新版本不需要了,如果手机没有开启USB开发者调试 ...

  7. python 代理的使用

    这里分享一个测试ip的网址     http://ip.filefab.com/index.php scrapy 随机请求头和代理ip的使用原理 import random # 添加一个中间键 cla ...

  8. 禅知Pro 1.6 前台任意文件读取 | 代码审计

    禅知 Pro v1.6 前台任意文件读取 | 代码审计 蝉知专业版是基于蝉知企业门户系统开源版开发,继承了蝉知本身的优秀功能.相对于蝉知开源版增强了商品的属性自定义.属性价格定制.物流跟踪.微信支付. ...

  9. 执行yum提示错误:rpmdb: BDB0113 Thread/process 424227/139826856310848 failed

    [问题]在执行yum安装或者其他命令时,有如下提示: [解决办法:重新构建rpm数据库] [root@cly ~]# cd /var/lib/rpm [root@cly rpm]# ls Basena ...

  10. 打造高效的工作环境 – SHELL 篇

    注:本文由雷俊(Javaer/Emacser)和我一起编辑,所以文章版权归雷俊与我共同所有,转载者必需注明出处和我们两位作者.原文最早发于酷壳微信公众号,后来我又做了一些修改,再发到博客这边. 程序员 ...