1. 引用
赋值语句会改变 变量的引用
与C语言的区别,c里面变量改变的是内存中的值,不会改变地址
int a = 1;int b = 1;int& c = a;std::cout << &a; //10010std::cout << &b; //10080std::cout << &c; //10010a = 2;std::cout << &a; //此时a的地址没变,只是a里面存储的数据从1->2
python 里面变量变得是地址,而不会改变内存的值。
a = 1b = aid(a) //10010id(b) //10010a = 2id(a) //此时a的地址变了,a->2id(b) //10010,b还是指向1
1.1 值传递和引用传递
def test(num):print("在函数内部d对应的内存地址是d" % (num, id(num)))//id(num)和id(a)的地址是一样的result = "hello"print("函数要返回数据的内存地址是%d" % id(result))//id(result)和id(r)的地址也是一样的return result#1.定义一个数字的变量a = 10print("a变量保存数据的内存地址是%d" % id(a) )#2. 调用test函数,本质上传递的是实参保存数据的引用,而不是实参保存的数据r = test(a)print("%s 的内存地址是%d" % (r, id(r)))
结论:python不允许程序员选择 采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值,
相当于通过“传引用”来传递对象。
如果函数收到的是一个不可变对象(比如数字、字符串或者元组)的引用,就不能直接修改原始对象,
相当于通过“传值”来传递对象。
2. 函数
2.1 多值参数
python中有两种多值参数,参数名前增加一个 可以接收元组。参数名前增加两个 可以接收字典。
—般在给多值参数命名时,习惯使用以下两个名字
*args -― 存放元组参数,前面有一个
**kwargs -― 存放字典参数,前面有两个
3. 类
3.1 dir内置函数
在Python中对象几乎是无所不在的,比如变量、数据、函数都是对象
可以使用以下两个方法验证python中的对象
- 在标识符/数据后输入一个 . 然后按下TAB键, iPython会提示该对象能够调用的所有方法
- 使用内置函数dir 传入标识符/数据,可以查看对象内的所有属性及方法
常用的内置方法:
__init__()
del() 对象被从内存中销毁前,会被自动调用 str() 返回对象的描述信息, print函数输出使用
3.2 方法
3.2.1 实例方法
使用def定义
class Cat:def eat(self):passTom = Cat()Tom.eat()
3.2.2 类方法
class Cat:@classmethoddef run(cls):pass# 通过 类名. 调用类方法Cat.run()
3.2.3 静态方法
如果需要在类中封装一个方法,既不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法这个时候,可以把这个方法封装成一个静态方法
语法如下:既没有self,也没有cls,因为不需要
class Cat:@astaticmethoddef run():pass# 通过 类名. 调用静态方法Cat.run()
3.3 属性
3.3.1 实例属性
当使用类名( )创建对象时,会自动执行以下操作:
- 为对象在内存中分配空间―创建对象
- 为对象的属性设置初始值―初始化方法( init )
这个初始化方法就是init方法,init是对象的内置方法,使用初始化方法在内部定义属性
在 init 方法内部使用 self.属性名=属性的初始值就可以定义属性
Tip:通过参数设置属性初始值 new_name
class Cat:def _init_(self, new_name) :print("这是一个初始化方法")self.name = new_namedef eat(self) :print ( "%s爱吃鱼" % self.name)tom = Cat("Tom")print(tom.name)
3.3.2 类属性
类属性就是在类对象中定义的属性,通常用来记录与这个类相关的特征,类属性不会记录具体对象的特征
使用赋值语句,定义类属性
class Tool(object):# 使用赋值语句,定义类属性,记录创建工具对象的总数count = 0def __init_(selr,name) :self.Name = name# 针对类属性做一个计数+1Tool.count += 1#创建工具对象tool1 = Tool["斧头"]tool2 = TooL["榔头"]tool3 = Tool["铁锹"]print(Tool.count)
注意:要访问 类属性有两种方式:
- 类名.类属性 Tool.count
- 对象.类属性(不推荐) tool1.count
