本文主要讲解三个方面内容:
1. 什么是类
2. 类的方法
3. 类的特性 (1.封装 2.继承 3.多态)
1. 什么是类
面向对象最重要的概念就是类(class)和实例(instance);
类是抽象的模板,python中原生的类,比如dict, list 等属于类;也可以自定义类,比如用一个Student类表示学生。
而实例是根据类创建出来的一个个具体的“对象”,属于同一个类的实例可能有自己不同的属性。
line1 定义类名
line2 定义初始化函数,一般用于属性的初始化
1 class firstClass(): 2 def __init__(self): 3 print('第一个类') 4 firstClass()
输出:
第一个类
<__main__.firstClass at 0x7f599cc82850>
这样就算创建了我们的第一个类了。大家可以看到这里面有一个self,其实它指的就是类aa的实例。每个类中的函数只要你不是类函数或者静态函数你都得加上这个self,当然你也可以用其他的代替这个self,只不过这是python中的写法,就好比Java 中的this。
2. 类的方法
根据可通过访问对象的不同分为:(静态方法、类方法和普通方法)
根据类的安全性不同分为:(安全方法、私有方法)
2.1 静态方法
2.2 类方法
2.3 普通方法(实例方法)
声明形式:
静态方法: 用 @staticmethod 装饰的不带 self 参数的方法叫做静态方法,类的静态方法可以没有参数,可以直接使用类名调用。
普通方法: 默认有个self参数,且只能被对象调用。
类方法: 默认有个 cls 参数,可以被类和对象调用,需要加上 @classmethod 装饰器
2.4 安全方法
2.5 私有方法
安全方法:可以在外部进行调用并且其他方法也能访问到,它允许本身的任何方法进行访问,并可在外部调用,安全属性也是;def _f()
私有方法:只能在私有方法内部调用,不能通过类名或者类的实例名来调用,所以你可以在其他方法中通过self.ww来调用或者cls.ww来调用,这样就做到了私有的功能。 def __f()
1 class newClass(): 2 def __init__(self): 3 print('第一个类启动') 4 5 def norm(self): 6 print("普通方法") 7 8 @staticmethod 9 def stam(): 10 print("静态方法") 11 12 @classmethod 13 def classm1(cls,num): 14 cls.num = 12 15 print(num) 16 17 @classmethod 18 def classm2(cls,num): 19 num = 12 20 print(cls.num) 21 22 print("-------类实例访问---------") 23 a = newClass() 24 a 25 a.norm() 26 a.stam() 27 a.classm1(10) 28 a.classm2(15) 29 print("-------类直接访问----------") 30 newClass().norm() 31 newClass().stam() 32 newClass().classm1(10) 33 newClass().classm2(15)
输出:
1 -------类实例访问--------- 2 第一个类启动 3 普通方法 4 静态方法 5 10 6 12 7 -------类直接访问---------- 8 第一个类启动 9 普通方法 10 第一个类启动 11 静态方法 12 第一个类启动 13 10 14 第一个类启动 15 12
上面的代码中,a = newClass()和newClass()是一样的;都是对类进行了实例化;
另一个例子:
class Classname: @staticmethod def fun(): print('静态方法') @classmethod def a(cls): print('类方法') # 普通方法 def b(self): print('普通方法') Classname.fun() Classname.a() C = Classname() C.fun() C.a() C.b()
输出
静态方法 类方法 静态方法 类方法 普通方法
输入:
Classname.b()
输出:
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-18-0c335b005b0f> in <module> ----> 1 Classname.b() TypeError: b() missing 1 required positional argument: 'self'
因为普通方法只能通过实例进行调用,不能使用类直接调用
3. 类的特性
封装、继承、多态、动态值修改(slots)