1. 引用
赋值语句会改变 变量的引用
与C语言的区别,c里面变量改变的是内存中的值,不会改变地址
int a = 1;
int b = 1;
int& c = a;
std::cout << &a; //10010
std::cout << &b; //10080
std::cout << &c; //10010
a = 2;
std::cout << &a; //此时a的地址没变,只是a里面存储的数据从1->2
python 里面变量变得是地址,而不会改变内存的值。
a = 1
b = a
id(a) //10010
id(b) //10010
a = 2
id(a) //此时a的地址变了,a->2
id(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 = 10
print("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):
pass
Tom = Cat()
Tom.eat()
3.2.2 类方法
class Cat:
@classmethod
def run(cls):
pass
# 通过 类名. 调用类方法
Cat.run()
3.2.3 静态方法
如果需要在类中封装一个方法,既不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法这个时候,可以把这个方法封装成一个静态方法
语法如下:既没有self,也没有cls,因为不需要
class Cat:
@astaticmethod
def 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_name
def eat(self) :
print ( "%s爱吃鱼" % self.name)
tom = Cat("Tom")
print(tom.name)
3.3.2 类属性
类属性就是在类对象中定义的属性,通常用来记录与这个类相关的特征,类属性不会记录具体对象的特征
使用赋值语句,定义类属性
class Tool(object):
# 使用赋值语句,定义类属性,记录创建工具对象的总数
count = 0
def __init_(selr,name) :
self.Name = name
# 针对类属性做一个计数+1
Tool.count += 1
#创建工具对象
tool1 = Tool["斧头"]
tool2 = TooL["榔头"]
tool3 = Tool["铁锹"]
print(Tool.count)
注意:要访问 类属性有两种方式:
- 类名.类属性 Tool.count
- 对象.类属性(不推荐) tool1.count