类的进阶

  • 面向对象是一种编程方式,此编程方式的实现是基于对  和 对象 的使用
  • 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中)
  • 对象,根据模板创建的实例(即:对象),实例用于调用被包装在类中的函数
  • 面向对象三大特性:封装、继承和多态

本篇将详细介绍Python 类的成员、成员修饰符、类的特殊成员。

类的成员

类的成员可以分为三大类:字段、方法和属性

字段: 静态字段,普通字段

方法:静态方法,类方法,实例方法

属性: 普通属性

注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段。而其他的成员,则都是保存在类中,即:无论对象的多少,在内存中只创建一份。

一、字段

字段包括:普通字段和静态字段,他们在定义和使用中有所区别,而最本质的区别是内存中保存的位置不同,

  • 普通字段属于对象
  • 静态字段属于
1 class Province: 2  3     # 静态字段 4     country = '中国' 5  6     def __init__(self, name): 7  8         # 普通字段 9         self.name = name10 11 12 # 直接访问普通字段13 obj = Province('河北省')14 print(obj.name)15 16 # 直接访问静态字段17 print(Province.country)18 字段的定义和使用

由上述代码可以看出【普通字段需要通过对象来访问】【静态字段通过类访问】,在使用上可以看出普通字段和静态字段的归属是不同的。其在内容的存储方式类似如下图:

由上图可是:

  • 静态字段在内存中只保存一份
  • 普通字段在每个对象中都要保存一份

应用场景: 通过类创建对象时,如果每个对象都具有相同的字段,那么就使用静态字段

二、方法

方法包括:普通方法、静态方法和类方法,三种方法在内存中都归属于类,区别在于调用方式不同。

  • 普通方法:由对象调用;至少一个self参数;执行普通方法时,自动将调用该方法的对象赋值给self
  • 类方法:由调用; 至少一个cls参数;执行类方法时,自动将调用该方法的复制给cls
  • 静态方法:由调用;无默认参数;
class Foo:    def __init__(self, name):        self.name = name    def ord_func(self):        """ 定义普通方法,至少有一个self参数 """        # print self.name        print('普通方法')
@classmethod    def class_func(cls):        """ 定义类方法,至少有一个cls参数 """        print('类方法')
@staticmethod    def static_func():        """ 定义静态方法 ,无默认参数"""        print('静态方法')
# 调用普通方法f = Foo()f.ord_func()# 调用类方法Foo.class_func()# 调用静态方法Foo.static_func()方法的定义和使用

相同点:对于所有的方法而言,均属于类(非对象)中,所以,在内存中也只保存一份。

不同点:方法调用者不同、调用方法时自动传入的参数不同。

三、属性  

如果你已经了解Python类中的方法,那么属性就非常简单了,因为Python中的属性其实是普通方法的变种。

对于属性,有以下三个知识点:

  • 属性的基本使用
  • 属性的两种定义方式

1、属性的基本使用

1 # ############### 定义 ############### 2 class Foo: 3  4     def func(self): 5         pass 6  7     # 定义属性 8     @property 9     def prop(self):10         pass11 # ############### 调用 ###############12 foo_obj = Foo()13 14 foo_obj.func()15 foo_obj.prop   #调用属性16 17 属性的定义和使用

View Code

来源:https://www.icode9.com/content-4-771101.html

(0)

相关推荐