1. 程式人生 > >self,__init__()方法,__str__()方法

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

使用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__方法需要返回一個字串,當做這個物件的描寫