Python是一门面向对象语言。
Class类是面向对象中非常重要的一个元素
什么是类呢?
Class类是一个功能的合集。
一:类的创建
1:类的构造函数
python
复制代码
# 定义类 class tests: '测试创建类' # 类文档字符串 projectName='' def __init__(self,name): print("初始化类调用了构造函数") self.projectName = name print("构造函数接收到了参数:",self.projectName) T = tests('时间里的')
输出:
复制代码
初始化类调用了构造函数 构造函数接收到了参数: 时间里的
第一种方法__init__()方法是一种特殊的方法,被称为类的构造函数或初始化方法,当创建了这个类的实例时就会调用该方法
self 代表类的实例,self 在定义类的方法时是必须有的,虽然在调用时不必传入相应的参数。
构造函数这个东西好像每个语言(目前我遇到的)基本上都差不多。
上边的类型我定义了一个类的成员变量projectName,这个是公共(public)权限的,关于这部分,后边的类的继承中会讲到。
2:self参数
类的方法都有一个固定的参数self(不一定非的是self,换成其他名字也可以)
类的方法和函数的区别就是这个,函数可以没有参数,类的方法必须有一个格外的参数
self 代表类的实例,而非类
python
复制代码
class Test: def prt(self): print(self) print(self.__class__) t = Test() t.prt()
输出:
kotlin
复制代码
<classObj.Test object at 0x0000027065349348> <class 'classObj.Test'>
从上边的代码我们可以看出:
Self指向类的对象
Self.__class__指向类
3:一个完整的类(构造函数,方法,属性)
python
复制代码
# 定义类 class Student: """ 测试创建类 """ # name name = '' # age age = '' # 构造函数 def __init__(self, name, age): print("初始化类调用了构造函数") self.name = name self.age = age print("构造函数接收到了参数:", self.name) # 获取 学生信息 def getStudentInfo(self): li = {'name': self.name, 'age': self.age} return li T = Student('时间里的', 18) li = T.getStudentInfo() print('学生姓名:', li['name']) print('学生年龄:', li['age'])
类的getStudentinfo方法返回的是一个字典
我们可以通过key来访问字典中的值
二:类的内置属性
dict : 类的属性(包含一个字典,由类的数据属性组成)
doc :类的文档字符串
name: 类名
module: 类定义所在的模块(类的全名是'main.className',如果类位于一个导入模块mymod中,那么className.module 等于 mymod)
bases : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
python
复制代码
class Employee: """ 员工类 """ name = '' duty = '' count = 0 def __init__(self, name, duty): self.name = name self.duty = duty def displayCount(self): self.count += 1 print("类对象的属性: %d" % self.count) print("类的属性: %d" % Employee.count) def displayEmployee(self): print("Name : ", self.name, ", Salary: ", self.duty) E = Employee('camellia', '收银') # 获取类文档 print("class的__doc__函数:", Employee.__doc__) # 获取类名称 print("class的__name__函数:", Employee.__name__) # 获取类文件 print("class的__module__函数:", Employee.__module__) # 类的所有父类构成元素 print("class的__bases__函数:", Employee.__bases__) # 类的属性 print("class的__dict__函数:", Employee.__dict__) # 调用方法 E.displayCount()
输出:
kotlin
复制代码
class的__doc__函数: 员工类 class的__name__函数: Employee class的__module__函数: classObj class的__bases__函数: (<class 'object'>,) class的__dict__函数: {'__module__': 'classObj', '__doc__': '\n 员工类\n ', 'name': '', 'duty': '', 'count': 0, '__init__': <function Employee.__init__ at 0x000002129D945318>, 'displayCount': <function Employee.displayCount at 0x000002129D945678>, 'displayEmployee': <function Employee.displayEmployee at 0x000002129D945828>, '__dict__': <attribute '__dict__' of 'Employee' objects>, '__weakref__': <attribute '__weakref__' of 'Employee' objects>} 类对象的属性: 1 类的属性: 0
三:类对象的销毁
当我们实例化一个类,在这个类不被使用的时候,我们需要使用析构函数__del__来销毁他。
python
复制代码
class Employee: """ 员工类 """ name = '' duty = '' count = 0 def __init__(self, name, duty): self.name = name self.duty = duty def displayCount(self): self.count += 1 print("类对象的属性: %d" % self.count) print("类的属性: %d" % Employee.count) def displayEmployee(self): print("Name : ", self.name, ", Salary: ", self.duty) def __del__(self): print('进入析构函数') E1 = Employee('camellia', '程序员') # 打印变量id print(id(E1)) # 销毁对象 del E1 # 再次打印对象id(因为对象在上一步中已销毁,因此,这里程序会报错) try: print(id(E1)) except: print("变量已销毁!")
输出:
复制代码
2149086649160 进入析构函数 变量已销毁!
具体相关的解释在代码中有注释,将上边的代码复制到你的pycharm中尝试一下就好。
四:类的静态方法以及类方法
Python的类中为我们提供了两个特殊的方法,类方法:classmethod 、 静态方法:staticmethod
这两种方法都不需要实例化类就可以被类本身调用
1:静态方法staticmethod
语法:
staticmethod(function)
示例:
python
复制代码
class Test: name = "时间里的" def __int__(self): pass @staticmethod def staticss(): print("调用类的静态方法") print("调用类的属性:", Test.name) # 类的调用 Test.staticss() # 类的对象调用 T = Test() T.staticss()
输出:
复制代码
调用类的静态方法 调用类的属性: 时间里的 调用类的静态方法 调用类的属性: 时间里的
静态方法staticmethod可以通过类调用,也可以通过类的对象调用,都可以。
2:类方法classmethod
类方法必须有一个参数 cls 这个是固定的
python
复制代码
class Test: name = "时间里的" def __int__(self): pass @classmethod def classMe(cls): print("调用类的类方法") print("调用类的属性:", cls.name) # 类的调用 Test.classMe() # 类的对象调用 T = Test() T.classMe()
输出:
复制代码
调用类的类方法 调用类的属性: 时间里的 调用类的类方法 调用类的属性: 时间里的
以上大概就是python类的基础使用
有好的建议,请在下方输入你的评论。