魔方方法以及self的作用:
- __init__ 构造函数:完成对象的初始化工作,方便统一管理、调用类创建对象时,自动执行。
- __del__ 析构函数:删除对象时执行一些操作,自动执行。
- __str__ 打印方法:输出执行信息,自动执行。
- 正常情况下类内方法必须要有self是为了复用代码,这是python使用class类默认的,如果不用self(或者其他命名),那就是类方法,需要特殊声明
使用魔方方法的例子(注释解释了self的作用)(:
class MyClass:
def __init__(self, name, hobby):
self.name = name # 把接收到的name传给实例化对象
self.hobby = hobby # 把接收到的id传给实例化对象
def __del__(self): # 当一个对象被销毁时,Python 解释器会调用这个方法(该例中由于创建了两个实例,且最后都被销毁了,所以会被调用两次)。
print("爆了")
def __str__(self): # 这个字符串是尝试将对象转换为字符串时使用的(该例在print(instance1)中被调用)
return f"大胆"
def my_method(self): # self储存的是实例化对象的id号,这样就可以实例化无数个Myclass
print(f"{self.name} 喜欢 {self.hobby} ")
# 创建类的实例
instance1 = MyClass("uzi", "take a shower")
instance2 = MyClass("ts", "eat plant")
# 调用方法
instance1.my_method() # 这里没有显式传递self,但Python会自动处理
instance2.my_method()
instance1.zzz = 4396 # 可以在实例化后在类外添加参数,但与其他实例化对象不共享,在类内使用self.xxx=xxx是所有实例化对象共享的
instance2.zzz = 1111 # 可以在实例化后在类外添加参数,但与其他实例化对象不共享,在类内使用self.xxx=xxx是所有实例化对象共享的
print(instance1.zzz
, instance2.zzz)
print(instance1)
在这个例子中,当调用 `instance1.my_method()` 时,Python会自动将 `instance1` 作为第一个参数传递给 `my_method` 方法,即使在调用时你没有显式地传递它。 `self` 参数的名称不是固定的,你可以使用任何其他名称,但 `self` 是一个广泛接受的约定。然而,使用 `self` 以外的名称可能会导致代码可读性降低,因为其他开发者可能不习惯看到除了 `self` 之外的参数名称用于引用实例。 总结来说,`self` 参数是类方法定义中的一个约定,它必须在方法的参数列表中作为第一个参数出现,但在调用方法时,你不需要显式地传递它,因为Python会自动处理。
类属性/方法 与 实例对象属性/方法 与 静态方法
类中存在方法和属性,方法和属性又分为类属性、类方法和实例化属性、实例化方法,一般默认的方法为实例化方法,所以大多数类内函数的第一个参数都必须是self。
1、
类属性/方法与self无关,类和对象都能调用并且是共享的,第一个参数传入cls。 实例化对象属性/方法使用self定义,只有对象能调用并且参数和数据独属于该对象,与其他对象不共享,第一个参数传入self 。静态方法不能调用类方法和类属性,用于解释说明
2、访问权限:实例化方法可以访问类属性,但是类方法不能访问实例化属性,静态方法不能访问类方法和类属性但同时可以被实例化方法和类方法访问
3、类方法的定义:类方法如果要使用函数来定义要使用装饰器@classmethod
实例化方法的定义:形如def xxxx:self.xxxxxxxxx
静态方法的定义:静态方法如果要使用函数来定义要使用装饰器@staticmethod
4、类方法的调用:如果说类名叫做Class,那么调用类方法就是class.xxxx。直接调用不需要实例化
实例化方法的调用:先实例化再用实例调用
5、类属性的定义和调用:在实例化方法外的“参数”,无论对象和类都可以调用
实例化属性定义和调用:在实例化方法内的“参数”,只有实例化的对象可以调用
ps:实例化的例子:
# 创建类的实例
instance1 = MyClass("uzi", "take a shower")
instance2 = MyClass("ts", "eat plant")
类方法、实例方法、静态方法使用例子
class Student(object):
"""
定义了一个学生类
"""
grade = 'py24101'
@classmethod
def cls_fun(cls):
"""类方法中只能调用类属性和类方法"""
print(f"班级名称是{cls.grade}")
def __init__(self, name, age):
self.name = name
self.age = age
def fun1(self):
"""实例方法中能调用类属性、实例属性"""
print(f"实例方法中输出类属性{self.grade}, 输出实例属性{self.name}")
@staticmethod
def sta_fun(x):
print(f"{x}静态方法一般实现与类和对象无关联的操作,例如:游戏说明书等")
s1 = Student('张三', 18)
# 如何调用类方法
Student.cls_fun()
s1.cls_fun()
# 如何调用实例方法
Student.fun1(s1)
s1.fun1()
# 如何调用静态方法
Student.sta_fun(3)
s1.sta_fun(3)
Python的内置类属性
- __dict__ : 类的属性(包含一个字典,由类的数据属性组成)
- __doc__ :类的文档字符串
- __name__: 类名
- __module__: 类定义所在的模块(类的全名是'__main__.className',如果类位于一个导入模块mymod中,那么className.__module__ 等于 mymod)
- __bases__ : 类的所有父类构成元素(包含了一个由所有父类组成的元组)
class Student(object):
"""
定义一个学生类
属性:名字 年龄
方法:method_1 method_2
"""
name = '张三'
age = 18
def method_1(self):
pass
def method_2(self):
pass
print(Student.__dict__)
print(Student.__doc__)
print(Student.__name__)
print(Student.__module__)
print(int.__module__)
print(Student.__bases__)