self,__init__()方法,__str__()方法

本文深入讲解Python面向对象编程,包括self变量的含义、构造方法init的使用、str方法的定义及对象描述信息的输出,帮助读者理解并掌握Python类与对象的创建与使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用self替换方法中的对象名

class Cat:
# 方法
def eat(self):
print(“猫在吃鱼…”)

def drink(self):
    print("猫在喝可乐...")

def introduce(self):
    # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄))
    # print("名字是:%s, 年龄是:%d" % (tom.name, tom.age))
    print("名字是:%s, 年龄是:%d" % (self.name, self.age))

#创建了一个对象
tom = Cat()
tom.name = “汤姆”
tom.age = 30
tom.eat()
tom.drink()
print(tom.name)
print(tom.age)
print("-"*30)
tom.introduce()

print("="*30)

#创建了另外一个对象
lan_mao = Cat()
lan_mao.name = “蓝猫”
lan_mao.age = 20
lan_mao.introduce() # 相当于lan_mao.introduce(lan_mao)
一个较为完整的程序
class Cat:
# 方法
def eat(self):
print("%s在吃鱼…" % self.name) # 这里换成self

def drink(self):
    print("%s在喝可乐..." % self.name)  # 这里换成self

def introduce(self):
    # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄))
    # print("名字是:%s, 年龄是:%d" % (tom.name, tom.age))
    print("名字是:%s, 年龄是:%d" % (self.name, self.age))

#创建了一个对象
tom = Cat()
tom.name = “汤姆”
tom.age = 30
tom.eat()
tom.drink()
print(tom.name)
print(tom.age)
print("-"*30)
tom.introduce()

print("="*30)

#创建了另外一个对象
lan_mao = Cat()
lan_mao.name = “蓝猫”
lan_mao.age = 20
lan_mao.introduce() # 相当于lan_mao.introduce(lan_mao)
lan_mao.eat()
lan_mao.drink()
总结
所谓的self,可以理解为自己
可以把self当做C++中类里面的this指针一样理解,就是对象自身的意思
某个对象调用其方法时,python解释器会把这个对象作为第一个参数传递给self,所以开发者只需要传递后面的参数即可
self仅仅是一个变量名,也可将self换为其他任意的名字,但是为了能够让其他开发人员能明白这变量的意思,因此一般都会self当做名字

init()方法
class Cat:

# 方法
def __init__(self, new_name, new_age):
    """在创建完对象之后 会自动调用, 它完成对象的初始化的功能"""
    # self.name = "汤姆"  # 如果这里写"汤姆"的话,只要是用这个Cat创建的任何对象,都叫做“汤姆”,因此不能使用
    # self.age = 20
    self.name = new_name
    self.age = new_age

def eat(self):
    print("%s在吃鱼...." % self.name)

def drink(self):
    print("%s在喝可乐..." % self.name)

def introduce(self):
    # print("名字是:%s, 年龄是:%d" % (汤姆的名字, 汤姆的年龄))
    # print("名字是:%s, 年龄是:%d" % (tom.name, tom.age))
    print("名字是:%s, 年龄是:%d" % (self.name, self.age))

#创建了一个对象
tom = Cat(“汤姆”, 30) # “汤姆”, 30这2个参数会自动传递到__init__方法中
#给对象tom添加了一个属性,叫name,里面的值是"汤姆"
#tom.name = “汤姆”
#tom.age = 30
tom.eat()
tom.drink()
print(tom.name)
print(tom.age)
print("-"*30)
tom.introduce() # 相当于tom.introduce(tom)

print("="*30)

lan_mao = Cat(“蓝猫”, 20)
#lan_mao.name = “蓝猫”
#lan_mao.age = 20
lan_mao.introduce() # 相当于lan_mao.introduce(lan_mao)
lan_mao.eat()
lan_mao.drink()
总结
init()方法,在创建一个对象时默认被调用,不需要手动调用
init(self)中,默认有1个参数名字为self,如果在创建对象时传递了2个实参,那么__init__(self)中出了self作为第一个形参外还需要2个形参,例如__init__(self,x,y)
init(self)中的self参数,不需要开发者传递,python解释器会自动把当前的对象引用传递进去

str()方法

  1. 打印id()
    如果把BMW使用print进行输出的话,会看到如下的信息
    在这里插入图片描述

即看到的是创建出来的BMW对象在内存中的地址

  1. 定义__str__()方法
    class Cat:
    “”“定义一个猫类”""

    def init(self, new_name, new_age):
    “”“在创建完对象之后 会自动调用, 它完成对象的初始化的功能”""
    # self.name = “汤姆”
    # self.age = 20
    self.name = new_name
    self.age = new_age # 它是一个对象中的属性,在对象中存储,即只要这个对象还存在,那么这个变量就可以使用
    # num = 100 # 它是一个局部变量,当这个函数执行完之后,这个变量的空间就没有了,因此其他方法不能使用这个变量

    def str(self):
    “”“返回一个对象的描述信息”""
    # print(num)
    return “名字是:%s , 年龄是:%d” % (self.name, self.age)

    def eat(self):
    print("%s在吃鱼…" % self.name)

    def drink(self):
    print("%s在喝可乐…" % self.name)

    def introduce(self):
    # print(“名字是:%s, 年龄是:%d” % (汤姆的名字, 汤姆的年龄))
    # print(“名字是:%s, 年龄是:%d” % (tom.name, tom.age))
    print(“名字是:%s, 年龄是:%d” % (self.name, self.age))

#创建了一个对象
tom = Cat(“汤姆”, 30)
print(tom)
总结
在python中方法名如果是__xxxx__()的,那么就有特殊的功能,因此叫做“魔法”方法
当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
__str__方法需要返回一个字符串,当做这个对象的描写

### Python 中 `self` 在 `__init__` 方法中的作用 在 Python 的类定义中,`self` 是实例对象的一个引用。当创建一个类的实例时,`self` 参数会自动指向这个新创建的对象[^1]。通过 `self`,可以在类的方法内部访问和修改该实例的属性。 以下是关于 `self` 和 `__init__` 方法的一些重要概念: #### 1. 初始化实例变量 `__init__` 方法是一个特殊方法,在创建类的新实例时会被调用。它用于初始化新创建的对象的状态。在这个过程中,可以通过 `self` 来设置属于当前实例的属性。例如: ```python class Country: def __init__(self, name): self.name = name # 使用 self 设置实例变量 def hello(self): print('Hello, my name is', self.name) c = Country('India') print(c.name) # 输出 'India' ``` 在这里,`self.name` 将参数 `name` 绑定到实例上,使得每次创建新的 `Country` 对象时都可以存储不同的名称。 #### 2. 访问实例变量 除了在 `__init__` 方法中设置实例变量外,还可以在整个类的其他方法中使用 `self` 来访问这些变量。这允许不同方法之间共享数据。 ```python def hello(self): print('Hello, my name is', self.name) ``` 上述代码片段展示了如何利用 `self` 引用来获取之前由 `__init__` 定义好的实例变量 `name` 并打印出来。 #### 3. 静态方法与类方法的区别 需要注意的是,虽然大多数情况下我们会在普通方法里看到 `self` 参数,但在静态方法 (`@staticmethod`) 或者类方法 (`@classmethod`) 中并不会传递隐式的第一个参数 (即 `self`)。这是因为它们分别绑定于整个类而不是具体的某个实例[^2]。 对于下面的例子来说: ```python class MyClass: @staticmethod def static_method(): pass # No access to instance via self here! @classmethod def class_method(cls): cls.some_class_variable += 1 # Accesses the class itself through cls instead of an individual object. ``` 这里既没有涉及任何特定实例的操作也没有依赖单个实体的行为模式;因此无需借助 `self` 实现功能扩展或者状态维护等功能需求场景下显得尤为重要。 #### 4. 特殊方法如 `__str__` 另外值得注意的一点是像 `__str__()` 这样的魔术方法同样接收 `self` 参数以便能够操作对应的实例并返回其字符串表示形式给外部使用者查看方便理解复杂结构化信息等内容展示方面具有重要意义[^3]: ```python class Person: def __init__(self, first_name, last_name): self.first_name = first_name self.last_name = last_name def __str__(self): return f"{self.first_name} {self.last_name}" p = Person("John", "Doe") print(p) # 调用了 p.__str__() ``` 此例子表明即使是在重写内置函数行为的时候也需要依靠 `self` 才能正确处理各个独立个体之间的差异之处从而达到预期效果.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值