self的使用
class Students(object):
def __init__(self,x,y):
self.name = x
self.age = y
def hello(self):
print('大家好,我是%s'%self.name)
# Students('小明',18) 这段代码具体做了什么
# 1.调用 __new__ 方法,用来申请内存空间
# 2.调用 __init__ 方法传入参数,将 self 指向创建好的内存空间,填充数据
# 3.变量 s1 指向创建好的内存空间
# 4.只要创建变量,就会创建一个新的内存空间
s1 = Students('小明',18)
# 此时需要调出内存中存放的name属性如下
print(s1.name) # 小明
# 如果该对象没有相应的属性,则调用时会报错,如下:
# print(s1.height)
# 动态属性
# 直接使用等号=,给一个属性赋值
# 如果这个属性存在,则会修改该属性的值
# 如果这个属性不存在,则会给对象添加一个新的属性及对应的值
s1.height = 1.75
print('新添加的的height属性为: %s'%s1.height)
s1.height = 1.95
print('修改后的height属性为: %s'%s1.height)
# 变量调用类中的方法时候,实际是由变量指定的内存空间去调用相应的方法
# 因此不同变量调用方法,输出不同
# 可以简单的理解为:此处的self,实际上是指的创建变量时,创建的那个内存空间
s1.hello()
__slots__属性的使用
- python本身支持类的动态属性
- 直接使用等号=,给一个属性赋值
- 如果这个属性存在,则会修改该属性的值
- 如果这个属性不存在,则会给对象添加一个新的属性及对应的值
- 如果需要禁止动态添加类的属性,可以使用
__slots__
属性,如下示例- 这个属性直接定义在类中,是一个元组,用来规定对象可以存在的属性
class Students(object):
__slots__ = ('name','age') # 此处规定当前类只能有name和age两个属性
def __init__(self,x,y):
self.name = x
self.age = y
def hello(self):
print('大家好,我是%s'%self.name)
s1 = Students('小明',18)
魔法方法的使用
魔法方法,也叫魔术方法,是类中的特殊的一些方法
- 特点:
- 1.不需要手动进行调用
- 2.这些方法,都是以双下划线开始,双下划线结束
__init__
- 3.方法名都是系统规定好的,在合适的时候自己调用
class Person(object):
# 在创建对象时,会自动调用__init__方法
def __init__(self):
print('调用__init__方法')
# 当这个对象被销毁时,会自动调用__del__方法
def __del__(self):
print('调用__del__方法')
# 默认情况下,直接打印对象默认会调__str__ 方法
# 使用 str() 进行类型转换时也会调用
def __str__(self):
return 'str'
# 如果没有定义 __str__ 方法,定义了 __repr__ 方法,则调用 __repr__ 方法
# 直接打印列表,会调用列表元素中的__repr__方法
def __repr__(self):
return 'repr'
# 使用 对象名() ==> 会直接调用这个对象的 __call__ 方法
def __call__(self, *args,**kwds):
print('__call__方法被调用了')
# 使用 == 对两个对象进行比较,实际上调用的是 __eq__ 方法
def __eq__(self, __o: object):
print('__eq__方法被调用了')
# 此处需要对需要比较的两个对象的比较值进行比较,并返回结果
# return False 或者return True
# 使用 != 对两个对象进行比较,实际上调用的是 __ne__ 方法
def __ne__(self, __o: object):
print('__ne__方法被调用了')
# 此处需要对需要比较的两个对象的比较值进行比较,并返回结果
# return False 或者return True
p = Person()
# 如果不作任何修改,直接打印对象,打印的是对象的类型和内存地址
# 当打印一个对象的时候,会调用这个对象的__str__ 或者__repr__方法
# 如果两个方法都写了,会选择str
print(p) # str
print(p.__repr__()) # repr
# 对象名() ==> 调用这个对象的 __call__ 方法
p() # __call__方法被调用了
p1 = Person()
p2 = Person()
# == 会调用对象的 __eq__ 方法,获取这个方法的比较结果
# 如果 __eq__ 方法不重写,默认依然是比较内存地址
print(p1 == p2) # False 本质上是调用 p1.__eq__(p2)
# != 本质上是调用对象的 __ne__ 方法,获取 __ne__ 方法的返回值
# 如果对象有 __ne__ 方法,则返回 __ne__ ,如果没有 __ne__ ,则对 __eq__ 方法取反
print(p1 != p2)