关于类的“方法链“或“链式调用问题:

lass Person:
    def __init__(self,name):
        self.name=name
        
    def age(self,age):
        self.age=age
        return self

    def sex(self,sex):
        self.sex=sex
        return self

p=Person('Tom').age(12).sex('male')
print(p.__dict__)

输出结果:{'name': 'Tom', 'age': 12, 'sex': 'male'}

在给定的代码中,return self语句用于在每个方法调用后返回对象本身。这种技术被称为"方法链"或"链式调用",它允许在同一行上连续调用多个方法。在这个例子中,age方法和sex方法都返回self,即当前的Person对象。这使得可以将多个方法调用链接在一起,如Person(‘Tom’).age(12).sex(‘male’),依次调用了age和sex方法。通过返回self,可以在调用一个方法后立即调用另一个方法,而不需要使用额外的变量来保存对象。这使得代码更简洁,易于阅读和理解。当你调用p=Person(‘Tom’).age(12).sex(‘male’)时,实际上创建了一个Person对象,然后依次调用了age和sex方法,并将最终的对象赋值给变量p。

lass Person:
    def __init__(self,name):
        self.name=name
        
    def age(self,age):
        self.age=age
        
    def sex(self,sex):
 
        self.sex=sex 
p=Person('Tom')
p.age(12)
p.sex('male')
print(p.__dict__)

输出结果:{'name': 'Tom', 'age': 12, 'sex': 'male'}

而在上述代码中,输出结果相同,但不需要在实例方法中添加return self。原因是在def age(self, age)和def sex(self,sex)方法中,不需要使用return self来返回对象本身,因为该方法没有返回值。当你调用p.age或者p.sex时,实际上是在访问p对象的age属性和sex属性,而不是调用age和sex方法。在给定的代码中,age和sex方法将age 和sex参数赋值给self.age self.sex属性。这意味着你可以通过p.age来访问p对象的age属性,而不需要使用方法调用语法。直接访问属性不需要使用return self。 所以,当你只输出p.age或p.sex时,不需要在def age(self, age)方法中使用return self,因为该方法只是简单地将值赋给属性,不需要返回对象本身。
补充知识:

  1. 什么时候使用return self ,什么时候不使用return self?

    return self通常在方法需要支持方法链或链式调用时使用。方法链是一种编程风格,允许在同一行上连续调用多个方法,并将返回的对象传递给下一个方法。
    在以下情况下使用return self:
    1.链式调用:如果你希望在同一行上连续调用多个方法,并且每个方法都应该返回对象本身,那么在每个方法中使用return self。
    2.可以有多个方法调用:当你希望在同一行上调用一个方法并立即访问该方法返回的对象的属性或调用其他方法时,可以使用return self。这使得代码更简洁且易于阅读。

在以下情况下不使用return self:

  1. 没有需要链式调用的需求:如果你的类的方法不需要支持链式调用,或者方法不会返回对象本身,那么就不需要使用return self。
  2. 方法需要返回其他值:如果你的方法需要返回一个特定的值而不是对象本身,那么就不需要使用return self。

总结起来,return self在方法需要支持方法链或链式调用时使用,以提供更灵活的编程风格。对于普通的方法,不需要使用return self,因为方法调用通常通过访问对象的属性或执行特定操作来实现目的。

2.什么叫做方法链或链式调用?
方法链或链式调用是一种编程风格,其中多个方法调用可以在同一行上连续进行,每个方法调用都返回对象本身,从而允许在一个对象上连续执行多个操作。通过方法链,可以将多个方法调用链接在一起,形成一个方法调用序列。每个方法调用都在前一个方法返回的对象上执行,而不是在原始对象上执行。这种编程风格的优势在于代码的简洁性和可读性。通过将多个操作链接在一起,可以在一行代码中完成多个操作,而不需要使用额外的变量来保存中间结果。这样的代码通常更易于理解和维护。
以下是一个简单示例,展示了方法链的使用:

class Calculator:
    def __init__(self, value):
        self.value = value

    def add(self, num):
        self.value += num
        return self
        
    def multiply(self, num):
        self.value *= num
        return self
result = Calculator(5).add(3).multiply(2).value
print(result)
输出结果:16

在上述示例中,Calculator类具有add和multiply两个方法,它们分别用于对值进行加法和乘法运算。每个方法在执行后都会返回对象本身(即self),以便可以继续在同一行上调用其他方法。通过链式调用,可以在一行代码中实现多个操作,并且最终的结果可以通过value属性访问。需要注意的是,使用方法链时要谨慎确保方法的顺序和调用顺序是符合预期的,以避免产生错误的结果。

  1. __dict__是什么?
    在Python中,__dict__是一个特殊的属性,用于存储一个对象的属性和方法的字典。它是一个字典对象,其中键是属性或方法的名称,而对应的值是相应的属性值或方法对象。

每个Python对象都有一个__dict__属性,它可以访问对象的命名空间。该属性提供了一种查看和修改对象属性的方法。

当你访问对象的__dict__属性时,你将得到一个包含对象的属性和方法的字典。你可以直接读取和修改这个字典来操作对象的属性。例如,你可以使用obj.dict[attribute_name]来获取或修改对象的属性值。

下面是一个简单的示例,展示了__dict__的使用:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def say_hello(self):
        print("Hello!")
        
# 创建一个Person对象
person = Person("Alice", 25)
# 查看对象的属性和方法字典
print(person.__dict__)
# 输出: {'name': 'Alice', 'age': 25}

# 修改对象的属性
person.__dict__["age"] = 30
print(person.__dict__["age"])
# 输出: 30

# 添加新的属性
person.__dict__["gender"] = "female"
print(person.__dict__["gender"])
# 输出: female

# 调用对象的方法
person.say_hello()
# 输出: Hello!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值