什么是類對象,什么是實例對象
類對象:
類名就是類對象
實例對象:
類創(chuàng)建的對象
類屬性,實例屬性
類屬性:
就是類所擁有的屬性,它被所有的類對象所共有,在內(nèi)存中只有一個副本,類似于c++和Java中的靜態(tài)成員變量.對于公有的類屬性,類對象和實例對象都可以訪問類屬性.
# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/6 14:07'
# 類屬性
class Person(object):
name = 'Tom' # 公有的類屬性
__age = 28 # 私有的類屬性
p = Person()
print(p.name) # 實例對象調(diào)用類屬性
print(Person.name) # 類對象調(diào)用類屬性
# print(p.__age) # 錯誤 不能通過類實例直接訪問私有的類屬性
# print(Person.__age) #錯誤 不能通過類對象直接訪問私有的類屬性
實例屬性:實例屬性是創(chuàng)建完實例之后,再加的屬性,一般__init__()方法中屬性就是實例屬性
# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/6 14:12'
class Person(object):
name = 'Tom' # 實例屬性
p = Person()
p.age = 18
print(p.name,p.age)
# print(Person.age) # 錯誤,實例屬性只能由實例調(diào)用,類對象不能調(diào)用
print(p.name)
print(Person.name)
p.name = 'Jack'
print(p.name,Person.name) # 這里打印 Jack Tom 而不是 Jack Jack
# 不能通過實例對象,修改類屬性,它只會去創(chuàng)建一個實例屬性,并不會改變類屬性的值.
實例方法,類方法,靜態(tài)方法
實例方法:
定義: 第一個參數(shù)必須是實例對象,一般用self來代替,通過它來傳遞實例的屬性和方法(也可以傳遞類的屬性和方法)
調(diào)用:只能由實例來調(diào)用
類方法:
定義:使用裝飾器@classmethod,第一個參數(shù)必須是類對象,該參數(shù)名一般約定為cls,通過它來傳遞類屬性和方法(不能傳遞實例對象和方法)
調(diào)用: 實例對象和類對象都可以調(diào)用
靜態(tài)方法:
定義:使用裝飾器你@staticmethod,參數(shù)沒有要求,不需要self,cls.但是方法中不能使用類或?qū)嵗娜魏螌傩院头椒?就是一個普通的函數(shù)放到了類中
調(diào)用: 實例對象和類對象都可以調(diào)用
# encoding:utf-8
__author__ = 'Fioman'
__time__ = '2019/3/6 14:21'
class Foo(object):
# 實例方法
def instance_method(self):
print("這是類{}的實例方法,只能被實例對象調(diào)用".format(Foo))
@classmethod
def class_method(cls):
print('這是類方法')
@staticmethod
def static_method():
print('這是靜態(tài)方法')
foo = Foo()
foo.instance_method()
foo.class_method()
foo.static_method()
print('下面的方法只能通過實例來調(diào)用')
foo.instance_method()
# Foo.instance_method() 錯誤:類對象不能調(diào)用實例方法
Foo.class_method()
Foo.static_method()
說明:
實例方法只能由實例對象調(diào)用,而類方法和靜態(tài)方法實例對象和類對象都可以調(diào)用.