1 Python的函数传递:

首先所有的变量都可以理解为内存中一个对象的‘引用’

a = 1

def func(a):

a = 2

func(a)

print(a) # 1

a = 1

def fun(a):

print("函数里",id(a)) # 函数里 41322472

a = 2

print("赋值后",id(a), id(2)) # 赋值后 41322448 41322448

print("函数外",id(a), id(1)) # 函数外 41322472 41322472

fun(a)

print(a) # 1

可以看到,在执行完a = 2之后,a引用中保存的值,即内存地址发生变化,由原来1对象的所在的地址变成了2这个实体对象的内存地址。下面我们来看另一个例子:

a = []

def fun(a):

a.append(1)

fun(a)

print a # [1]

a = []

def fun(a):

print("函数里",id(a)) # 函数里 53629256

a.append(1)

print("函数外",id(a)) # 函数外 53629256

fun(a)

print(a) # [1]

注意:

类型是属于对象的,而不是变量。而对象有两种,“可更改”(mutable)与“不可更改”(immutable)对象。

strings, tuples, 和numbers是不可更改的对象,而 list, dict, set 等则是可修改的对象。

当一个引用传递给函数的时候,函数自动复制一份引用,这个函数里的引用和外边的引用没有半毛关系了.所以第一个例子里函数把引用指向了一个不可变对象number,当函数返回的时候,外面的引用没半毛感觉.而第二个例子就不一样了,函数内的引用指向的是可变对象list,指向了列表的内存地址,因此调用并不会改变list内存地址.

2 python中元类

Python中的类也是对象。元类就是用来创建这些类(对象)的,元类就是类的类

MyClass = MetaClass() #元类创建

MyObject = MyClass() #类创建实例

实际上MyClass就是通过type()来创建出MyClass类,它是type()类的一个实例;同时MyClass本身也是类,也可以创建出自己的实例,这里就是MyObject

类就是创建类这种对象的东西, type就是Python的内建元类,当然了,你也可以创建自己的元类。

age = 35

age.__class__

#输出:

name = 'bob'

name.__class__

#输出:

def foo():

pass

foo.__class__

#输出:

class Bar(object):

pass

b = Bar()

b.__class__

#输出:

对于任何一个__class__的__class__属性又是什么呢?

a.__class__.__class__

#输出:

age.__class__.__class__

#输出:

foo.__class__.__class__

#输出:

b.__class__.__class__

#输出:

3 静态方法(@staticmethod)和类方法(@classmethod)

Python其实有3个方法,即静态方法(staticmethod),类方法(classmethod)和实例方法

def foo(x): #常规方法

print("executing foo(%s)"%(x))

class A(object):

#实例方法

def foo(self,x): #默认第一个参数为实例对象

print("executing foo(%s,%s)"%(self,x))

#类方法

@classmethod

def class_foo(cls,x): #默认第一个参数为类对象

print ("executing class_foo(%s,%s)"%(cls,x))

#静态方法

@staticmethod #不需要绑定,调用注意

def static_foo(x):

print("executing static_foo(%s)"%x)

a=A()

函数参数里面的self和cls.这个self和cls是对实例或者类的绑定

对于一般的函数来说我们可以这么调用foo(x),这个函数就是最常用的,它的工作跟任何东西(类,实例)无关.

对于实例方法,我们知道在类里每次定义方法的时候都需要绑定这个实例,就是foo(self, x),因为实例方法的调用离不开实例,我们需要把实例自己传给函数,调用的时候是这样的a.foo(x)(其实是foo(a, x)).

类方法一样,只不过它传递的是类而不是实例,A.class_foo(x).注意这里的self和cls可以替换别的参数,但是python的约定是这俩

对于静态方法其实和普通的方法一样,不需要对谁进行绑定,唯一的区别是调用的时候需要使用a.static_foo(x)或者A.static_foo(x)来调用.不管是 类调用,还是实例调用静态方法,都是指向同一个函数对象

#

实例方法

类方法

静态方法

a = A()

a.foo(x)

a.class_foo(x)

a.static_foo(x)

A

不可用

A.class_foo(x)

A.static_foo(x)

4 类变量与实例变量

类变量 : 是可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的)。

实例变量 : 实例化之后,每个实例单独拥有的变量。

class Test(object):

num_of_instance = 0 #类变量

def __init__(self, name): #name就是实例变量

self.name = name

Test.num_of_instance += 1

if __name__ == '__main__':

print(Test.num_of_instance) # 0

t1 = Test('jack')

print(Test.num_of_instance) # 1

t2 = Test('lucy')

print(t1.name , t1.num_of_instance) # jack 2

print(t2.name , t2.num_of_instance) # lucy 2

class Person:

name="aaa"

p1=Person()

p2=Person()

p1.name="bbb"

print p1.name # bbb

print p2.name # aaa 对象名.属性

print Person.name # aaa 类名.属性

这里p1.name="bbb"是实例调用了类变量,,类似函数传参的问题,p1.name一开始是指向的类变量name="aaa",但是在实例的作用域里把类变量的引用改变了,就变成了一个实例变量,self.name不再引用Person的类变量name了。

python类与函数编程_Python类三种方法,函数传参,类与实例变量(一)详解相关推荐

  1. python中pca算法_Python使用三种方法实现PCA算法

    主成分分析(PCA) vs 多元判别式分析(MDA) PCA和MDA都是线性变换的方法,二者关系密切.在PCA中,我们寻找数据集中最大化方差的成分,在MDA中,我们对类间最大散布的方向更感兴趣. 一句 ...

  2. 手把手教你应用三种工厂模式在SpringIOC中创建对象实例【案例详解】

    目录 一.工厂模式介绍 二.通过静态工厂方法创建Bean实例 三.通过实例工厂方法创建Bean实例 四.通过自定义的factoryBean来创建bean对象 Hello,你好呀,我是灰小猿!一个超会写 ...

  3. Javascript定义类(class)的三种方法

    将近20年前,Javascript诞生的时候,只是一种简单的网页脚本语言.如果你忘了填写用户名,它就跳出一个警告. 如今,它变得几乎无所不能,从前端到后端,有着各种匪夷所思的用途.程序员用它完成越来越 ...

  4. python csv库,Python 中导入csv数据的三种方法

    Python 中导入csv数据的三种方法,具体内容如下所示: 1.通过标准的Python库导入CSV文件: Python提供了一个标准的类库CSV文件.这个类库中的reader()函数用来导入CSV文 ...

  5. python打开文件不存在-Python判断文件是否存在的三种方法

    原标题:Python判断文件是否存在的三种方法 通常在读写文件之前,需要判断文件或目录是否存在,不然某些处理方法可能会使程序出错.所以最好在做任何操作之前,先判断文件是否存在. 这里将介绍三种判断文件 ...

  6. python 命令-python解析命令行参数的三种方法详解

    这篇文章主要介绍了python解析命令行参数的三种方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 python解析命令行参数主要有三种方法: ...

  7. python判断字符串合法,详解Python判定IP地址合法性的三种方法 python中判断一个字符串是否是IP地址...

    html 中 鼠标放在标签上会显示小手状,其它标签在其他标签上,美工给加了一些样式,鼠标放上去也显示小手状.有哪位大手状样式 有什么不懂的前端问题可以去菜鸟驿站.全都是泡沫,只一刹的花火,所谓的友情, ...

  8. python判断回文数字,Python判断回文数的三种方法实例

    需求: 从控制台输入一个五位数,如果是回文数就打印"是回文数",否则打印"不是回文数",例如:11111 12321 12221 "回文"是 ...

  9. python控制示波器获取波形_三种方法教你用示波器快速捕获异常

    万事开头难!当你想用示波器来分析问题时,你一定有想过,我要如何才能把问题抓下来?当然,只有抓下来之后,才能进行后面种种的分析,否则一切都是空谈.本文将带你用三种最好用的方法将异常抓下来. 一.滚动模式 ...

  10. python一次性读取整个文件-python逐行读取文件内容的三种方法

    一.使用open打开文件后一定要记得调用文件对象的close()方法.比如可以用try/finally语句来确保最后能关闭文件. 二.需要导入import os 三.下面是逐行读取文件内容的三种方法: ...

最新文章

  1. php开发我的世界插件,WorldEdit/开发与API
  2. js选择checkbox值,组织成key-value形式,传值到后台
  3. iOS开展block说明
  4. C# 语法练习(3): 运算符
  5. OpenKruise v0.8.0 核心能力解读:管理 Sidecar 容器的利器
  6. 系统架构师笔记(1)
  7. 「Ubuntu」仓库 “https://mirrors.tuna.tsinghua.edu.cn/ubuntu focal Release” 没有 Release 文件。
  8. Scrapy运行中常见网络相关错误
  9. DVWA Command Injection 练习总结
  10. 关于python_关于Python,你必须知道的事!
  11. 【java】 获取计算机信息及Java信息
  12. navicat premium相关应用(将oracle数据库迁移到mysql等)
  13. [Vue] Computed property XXX was assigned to but it has no setter.
  14. Java 疑问自问自答
  15. 微信小程序 时间插件 (可以选择日期+星期)
  16. Java SE基础——Java集合
  17. 1、串口(UART/COM/TTL/RS232/RS485)
  18. Word Maze(单词迷宫)
  19. 30分钟了解蒙特卡洛方法
  20. 中国电信无线网服务器,如何使用路由器共享电信天翼无线网络?

热门文章

  1. 阿里巴巴工程师:Java 编程技巧之数据结构
  2. 【城市沙龙】LiveVideoStack Meet | 长沙:多媒体与广电
  3. Go连接及操作MySQL
  4. JVM之方法区Mothed Area
  5. 深入理解计算机系统:进程
  6. gcc 参数 -fprofile-arcs -ftest-coverage作用
  7. 基于Win32Api创建窗口程序
  8. 大剑无锋之Redis面试题【推荐】
  9. HTTP系列之:HTTP缓存
  10. 看动画学算法之:排序-归并排序