我 的 个 人 主 页: 失心疯的个人主页
入 门 教 程 推 荐 : Python零基础入门教程合集
虚 拟 环 境 搭 建 : Python项目虚拟环境(超详细讲解)
PyQt5 系 列 教 程: Python GUI(PyQt5)文章合集
Oracle数据库教程: Oracle数据库文章合集
优 质 资 源 下 载 : 资源下载合集
# 定义一个函数
def eat():
print(1)
print(2)
print(3)
# 函数调用
eat()
# 定义一个类
class Person:
# 定义一个方法
def eat2(self):
print(1)
print(2)
print(3)
# 实例化对象
p = Person()
# 方法调用
p.eat2()
类属性
和实例属性
根据方法的第一个参数必须接受的数据类型来进行划分
- 实例方法:第一个参数需要接收到一个实例
- 类 方 法:第一个参数需要接收到一个类
- 静态方法:第一个参数不默认接收任何类型
示例代码
class ClassName:
def instance_func(self):
print('这是一个实例方法', self)
@classmethod
def class_func(cls):
print('这是一个类方法', cls)
@staticmethod
def static_func():
print('这是一个静态方法')
c = ClassName()
print(c) # <__main__.ClassName object at 0x000001820A26CF10>
c.instance_func() # 这是一个实例方法 <__main__.ClassName object at 0x000001820A26CF10>
ClassName.class_func() # 这是一个类方法
# 通过实例调用,会忽略实例,并自动将实例对应的类当做参数传递
c.class_func() # 这是一个类方法
ClassName.static_func() # 这是一个静态方法
c.static_func() # 这是一个静态方法
# 通过类直接调用实例方法,会报错
# ClassName.instance_func() # TypeError: instance_func() missing 1 required positional argument: 'self'
ClassName().instance_func() # 这是一个实例方法 <__main__.ClassName object at 0x0000015E5626CDC0>
__dict__
属性字典中)class ClassName:
def instance_func(self, arg1, ...):
print('这是一个实例方法', self)
# 这里的self参数是一个形参,只是默认用self,其实可以修改为任何变量,与*args, **kwargs一样
标准调用(通过实例调用
实例.实例方法(实参1, ...)
# 使用实例调用方法,解释器会自动把调用对象本身传递过去
# 如果实例方法没有接收任何参数,则会报错(一个自动传,一个不接收)
通过类调用(基本不用)
类名.实例方法(实例, 实参1, ...)
# 通过类调用实例方法,需要手动传入第一参数,传入一个实例对象
间接调用
变量 = 类名.实例方法
变量(实例, 实参1, ...)
# 本质就是直接找到函数本身来调用
class ClassName:
@classmethod
def class_func(cls, arg1, ...):
print('这是一个类方法', cls)
类.类方法(实参1, ...)
实例.类方法(实参1, ...)
# 通过实例调用,会忽略实例对象,并自动将实例对应的类对象当做参数传递
变量 = 实例.类方法
变量(实参1, ...)
class ClassName:
@classmethod
def class_func(cls):
print('这是一个类方法', cls)
class ClassSub(ClassName):
pass
ClassSub.class_func() # 这是一个类方法
class ClassName:
@staticmethod
def static_func(arg1, ...):
print('这是一个静态方法')
类.静态方法(实参1, ...)
# 通过实例调用,会忽略类对象,不会将类对象当做参数传递
实例.静态方法(实参1, ...)
# 通过实例调用,会忽略实例对象,不会将实例对象当做参数传递
变量 = 实例.静态方法
变量(实参1, ...)
class ClassName:
b = '类属性'
def instance_func(self):
print(self) # <__main__.ClassName object at 0x0000029090ECCF10>
print(self.a) # 实例属性
print(self.b) # 类属性
@classmethod
def class_func(cls):
print(cls) #
print(cls.b) # 类属性
# 类方法不能访问实例属性,会报错
# print(cls.a) # AttributeError: type object 'ClassName' has no attribute 'a'
@staticmethod
def static_func():
# print(a) # 静态方法无法访问实例属性
# print(b) # 静态方法无法直接访问类属性
print(ClassName.b) # 类属性
c = ClassName()
c.a = '实例属性'
# # 通过实例调用实例方法
# c.instance_func()
# # 通过类调用类方法
# ClassName.class_func()
# # 通过实例调用类方法
# c.class_func()
# # 通过类调用静态方法
# ClassName.static_func()
# # 通过实例调用静态方法
# c.static_func()
# 定义一个类
class Person:
# 定义一个类属性并赋值
age = 36
# 实例化一个对象,并赋值给p
p = Person()
# 给实例对象增加属性
p.name = '张三'
print(p.name) # 张三
print(p.age) # 36
# 可以难过类对象直接访问类属性
print(Person.age) # 36
# 不能通过类对象直接访问实例属性,会报错
# print(Person.name) # AttributeError: type object 'Person' has no attribute 'name'
__class__
查找到对应的类对象,再到类对象中查找这个属性
- 通过实例对象可以访问实例属性,也可以访问类属性
- 通过类对象只能访问类属性,不能访问到实例属性
- 在调用实例方法时,会自动将示例对象传递给实例方法中的
self
参数,此时self
就是实例对象本身,所以可以通过self.实例属性
访问实例属性,也可以通过self.类属性
访问类属性- 在调用类方法时,会自动将类对象传递给类方法中的
cls
参数,此时cls
就是类对象本身,所以可以通过cls.类属性
访问类属性,但不能通过cls.实例属性
访问实例属性- 静态方法既不传实例对象也不传类对象,所以在静态方法中无法获取到实例对象和类对象,所以无法访问到实例属性和类属性,只能通过
类对象.类属性
访问类属性,但是基本不会用到这种(因为在方法中需要操作类对象相关,那就可以直接定义类方法了)