1. 引用

赋值语句会改变 变量的引用
与C语言的区别,c里面变量改变的是内存中的值,不会改变地址

  1. int a = 1;
  2. int b = 1;
  3. int& c = a;
  4. std::cout << &a; //10010
  5. std::cout << &b; //10080
  6. std::cout << &c; //10010
  7. a = 2;
  8. std::cout << &a; //此时a的地址没变,只是a里面存储的数据从1->2

python 里面变量变得是地址,而不会改变内存的值。

  1. a = 1
  2. b = a
  3. id(a) //10010
  4. id(b) //10010
  5. a = 2
  6. id(a) //此时a的地址变了,a->2
  7. id(b) //10010,b还是指向1

1.1 值传递和引用传递

  1. def test(num):
  2. print("在函数内部d对应的内存地址是d" % (num, id(num)))
  3. //id(num)和id(a)的地址是一样的
  4. result = "hello"
  5. print("函数要返回数据的内存地址是%d" % id(result))
  6. //id(result)和id(r)的地址也是一样的
  7. return result
  8. #1.定义一个数字的变量
  9. a = 10
  10. print("a变量保存数据的内存地址是%d" % id(a) )
  11. #2. 调用test函数,本质上传递的是实参保存数据的引用,而不是实参保存的数据
  12. r = test(a)
  13. print("%s 的内存地址是%d" % (r, id(r)))

结论:python不允许程序员选择 采用传值还是传引用。Python参数传递采用的肯定是“传对象引用”的方式。
如果函数收到的是一个可变对象(比如字典或者列表)的引用,就能修改对象的原始值,
相当于通过“传引用”来传递对象。
如果函数收到的是一个不可变对象(比如数字、字符串或者元组)的引用,就不能直接修改原始对象,
相当于通过“传值”来传递对象。

2. 函数

2.1 多值参数

python中有两种多值参数,参数名前增加一个 可以接收元组。参数名前增加两个 可以接收字典。
—般在给多值参数命名时,习惯使用以下两个名字
*args -― 存放元组参数,前面有一个
**kwargs -― 存放字典参数,前面有两个

3. 类

3.1 dir内置函数

在Python中对象几乎是无所不在的,比如变量、数据、函数都是对象
可以使用以下两个方法验证python中的对象

  1. 在标识符/数据后输入一个 . 然后按下TAB键, iPython会提示该对象能够调用的所有方法
  2. 使用内置函数dir 传入标识符/数据,可以查看对象内的所有属性及方法

    常用的内置方法:

    1. __init__()

    del() 对象被从内存中销毁前,会被自动调用 str() 返回对象的描述信息, print函数输出使用

3.2 方法

3.2.1 实例方法

使用def定义

  1. class Cat
  2. def eat(self):
  3. pass
  4. Tom = Cat()
  5. Tom.eat()

3.2.2 类方法

  1. class Cat
  2. @classmethod
  3. def run(cls):
  4. pass
  5. # 通过 类名. 调用类方法
  6. Cat.run()

3.2.3 静态方法

如果需要在类中封装一个方法,既不需要访问实例属性或者调用实例方法,也不需要访问类属性或者调用类方法这个时候,可以把这个方法封装成一个静态方法
语法如下:既没有self,也没有cls,因为不需要

  1. class Cat
  2. @astaticmethod
  3. def run():
  4. pass
  5. # 通过 类名. 调用静态方法
  6. Cat.run()

3.3 属性

3.3.1 实例属性

当使用类名( )创建对象时,会自动执行以下操作:

  1. 为对象在内存中分配空间―创建对象
  2. 为对象的属性设置初始值―初始化方法( init )

这个初始化方法就是init方法,init是对象的内置方法,使用初始化方法在内部定义属性
init 方法内部使用 self.属性名=属性的初始值就可以定义属性

Tip:通过参数设置属性初始值 new_name

  1. class Cat:
  2. def _init_(self, new_name) :
  3. print("这是一个初始化方法")
  4. self.name = new_name
  5. def eat(self) :
  6. print ( "%s爱吃鱼" % self.name)
  7. tom = Cat("Tom")
  8. print(tom.name)

3.3.2 类属性

类属性就是在类对象中定义的属性,通常用来记录与这个类相关的特征,类属性不会记录具体对象的特征
使用赋值语句,定义类属性

  1. class Tool(object):
  2. # 使用赋值语句,定义类属性,记录创建工具对象的总数
  3. count = 0
  4. def __init_(selr,name) :
  5. self.Name = name
  6. # 针对类属性做一个计数+1
  7. Tool.count += 1
  8. #创建工具对象
  9. tool1 = Tool["斧头"]
  10. tool2 = TooL["榔头"]
  11. tool3 = Tool["铁锹"]
  12. print(Tool.count)

注意:要访问 类属性有两种方式:

  1. 类名.类属性 Tool.count
  2. 对象.类属性(不推荐) tool1.count