Python基础-11 面向对象编程_各种方法

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) 

猜你喜欢

转载自blog.csdn.net/Lz__Heng/article/details/130192252
今日推荐