前言
在python中,以前后各有兩個下劃線的這種方式命名的標識符,稱為魔法屬性,或魔法方法顽冶,這些魔法屬性或魔法方法,是python中內(nèi)置的,預先定義好一些功能的屬性或方法售碳。接下來就分別介紹它們绞呈。
init 方法的基本使用與代碼解析
- init 方法的作用是為對象進行初始化 initialization佃声,該方法會在創(chuàng)建對象時,自動調(diào)用
- 一般會將對象所具有的屬性放到這個方法中,進行初始化,不在使用動態(tài)綁定為對象添加屬性
- 使用方法: self.屬性名 = 值 的方式添加屬性
'''
通過 __init__ 方法來為對象進行初始化
'''
# 定義一個學生類
class Student(object):
# 實現(xiàn) __init__ 方法
def __init__(self):
print('Init Run ...')
# 添加屬性
self.name = 'tom'
self.age = 12
tom = Student()
print(tom.name)
print(tom.age)
jack = Student()
# 對屬性的修改
jack.name = 'Jack'
print(jack.name)
print(jack.age)
結(jié)果如下:
Init Run ...
tom
12
Init Run ...
Jack
12
問題圾亏?
在類的方法里定義屬性的固定值封拧,則每隔對象實例變量的屬性值都是相同的泽西,有什么辦法可以讓實例的每個對象都有不同的屬性值?
帶參數(shù)的init方法使用與代碼解析
- 通過一個類陕见,可以創(chuàng)建多個對象味抖,就好比 通過一個模具創(chuàng)建多個實體一樣
- init(selt)中,默認只有一個參數(shù)忍坷,如果在創(chuàng)建對象時傳遞了2個實參承匣,那么init(selt)中出現(xiàn)了self作為第一個形參外锤悄,還需要2個形參零聚,例如:init(selt,x,y) 代碼解析如下:
'''
通過 init 方法些侍,傳入相應(yīng)的參數(shù),利用這些參數(shù)為對象的屬性進行初始化
'''
class Student(object):
# 實現(xiàn) 帶參數(shù)的init方法
def __init__(self, new_name,new_age):
# 添加 屬性
self.name = new_name
self.age = new_age
print(f'{self.name} Init Run')
# 實例一個對象
tom = Student('tom',12)
print(tom.name)
print(tom.age)
jack = Student('Jack',22)
print(jack.name)
print(jack.age)
結(jié)果如下:
tom Init Run
tom
12
Jack Init Run
Jack
22
str 使用方法及代碼解析
- 當使用print輸出對象時蚂会,默認打印對象的內(nèi)存地址胁住。如果類定義了str(self)方法,那么就會打印從這個方法中return的數(shù)據(jù)
- str方法通常返回一個字符串彪见,作為這個對象的描述信息 代碼解析如下:
class Cat(object):
def __init__(self, name, age):
self.name = name
self.age = age
# 實現(xiàn)__str__ 方法
# 該 方法必須 返回一個字符串類型的數(shù)據(jù)
def __str__(self):
# return f'[姓名:{self.name} 年齡:{self.age}]'
# return f'{"name":{self.name}, "age":{self.age}}' # 因為{}的原因余指,所以不行
# return '{name:%s, age: %d}' %(self.name,self.age)
return '{' + f'name:{self.name}, age:{self.age}' + '}'
tom = Cat('Tom', 1)
print(tom)
jack = Cat('Jack',2)
print(jack)
#調(diào)用str方法,把對象tom傳入碉碉,得到的結(jié)果一樣
stu_string = str(tom)
結(jié)果如下:
{name:Tom, age:1}
{name:Jack, age:2}
#調(diào)用方法后的結(jié)果垢粮,和上面結(jié)果一樣
{name:Tom, age:1}
{name:Jack, age:2}
del方法使用及代碼解析
- 當刪除對象后缸濒,python解釋器也會默認調(diào)用一個方法,就是del()
- 當有變量保存了一個對象的引用時斩跌,此對象的引用計數(shù)就會加1
- 當使用del()刪除變量指向的對象時捞慌,則會減少對象的引用計數(shù)啸澡。如果對象的引用計數(shù)不為1,那么會讓這個對象的引用計數(shù)減1洛姑,當對象的引用計數(shù)為0時皮服,則對象才會被真正的刪除(內(nèi)存被回收)。
'''
__del__方法
用來在銷毀對象時自動 調(diào)用 該 方法
'''
class Cat(object):
def __init__(self):
self.childs = ['tom1','tom2','tom2']
def __del__(self):
# 在銷毀當前對象之前硫眯,將自己管理的屬性對象先銷毀择同,回收資源
# del self.childs
print('Del Run ...')
tom = Cat()
# del tom
tom.childs
print('over')
結(jié)果如下:
over
Del Run ...
改變del方法代碼后:
def __del__(self):
# 在銷毀當前對象之前敲才,將自己管理的屬性對象先銷毀择葡,回收資源
del self.childs
print('Del Run ...')
tom = Cat()
del tom
tom.childs
print('over')
刪除之后結(jié)果如下:
Traceback (most recent call last):
NameError: name 'tom' is not defined
Del Run ...