1. 程式人生 > >002--對象和類

002--對象和類

foo 操作 兩個 fff 另一個 pin 實例 一個個 self.

對象和類

對象是什麽?

在面向對象編程中,對象大致意味著一系列數據(屬性)以及一套訪問和操作這些數據的方法。

對象:類的實例

類是什麽?

類即類別、種類,是面向對象設計最重要的概念。

類:一種對象,每個對象都屬於特定的類。

問題1:先有類還是先有對象?

先有的一個個具體存在的對象(比如一個具體存在的人),還是先有的人類這個概念,這個問題需要分兩種情況去看

  • 在現實世界中:肯定是先有對象,再有類
  • 在程序中:務必保證先定義類,後產生對象

創建自定義類

在Python中程序中的類:

  • 用class關鍵字定義
  • 關鍵字首字母大寫
  • 特征用變量標識
  • 技能用函數標識

因而類中最常見的無非是:變量和函數的定義

一個簡單的示例:

class Person:
    def set_name(self,name):
        self.name
=name def get_name(self): return self.name def greet(self): print("hello,world! I am {}".format(self.name)) #創建兩個實例 foo=Person() bar=Person() foo.set_name("Lucy") bar.set_name("Jessie") foo.greet() bar.greet() #輸出 hello,world! I am Lucy hello,world! I am Jessie

從上面示例不難看出:

  • 該示例包含三個方法,他們類似於函數定義,位於class語句內。
  • self指向對象本身,例如:對foo調用set_name和greet時,foo都會作為第一個參數自動傳給他們。

實際上,可以隨便給這個參數命名,但鑒於它總是指向對象本身,因此習慣上將其命名為self。

類的使用

class OldboyStudent:
    school=oldboy
    def learn(self):
        print(is learning)

    def eat(self):
        print(is eating)

    def sleep(self):
        print(is sleeping)

1、引用類的屬性

OldboyStudent.school # OldboyStudent.school=Oldboy # OldboyStudent.x=1 # del OldboyStudent.x #

2、調用類

  • 或稱為實例化,得到程序中的對象
s1=OldboyStudent()
s2=OldboyStudent()
s3=OldboyStudent()

#如此,s1、s2、s3都一樣了,而這三者除了相似的屬性之外還各種不同的屬性,這就用到了__init__

3、__init__方法

#註意:該方法是在對象產生之後才會執行,只用來為對象進行初始化操作,可以有任意代碼,但一定不能有返回值
class OldboyStudent:
    ......
    def __init__(self,name,age,sex):
        self.name=name
        self.age=age
        self.sex=sex
    ......

s1=OldboyStudent(李坦克,,18) #先調用類產生空對象s1,然後調用OldboyStudent.__init__(s1,‘李坦克‘,‘男‘,18)
s2=OldboyStudent(王大炮,,38)
s3=OldboyStudent(牛榴彈,,78)

對象的使用

1、查看對象的名稱空間

  • cls.__dict__
#執行__init__,s1.name=‘牛榴彈‘,很明顯也會產生對象的名稱空間可以用s2.__dict__查看,查看結果為
print(s2.__dict__)
{name: 王大炮, age: , sex: 38}

2、對象的屬性

s2.name #查,等同於s2.__dict__[‘name‘]
s2.name=王三炮 #改,等同於s2.__dict__[‘name‘]=‘王三炮‘
s2.course=python #增,等同於s2.__dict__[‘course‘]=‘python‘
del s2.course #刪,等同於s2.__dict__.pop(‘course‘)

補充說明

  • 站的角度不同,定義出的類是截然不同的;
  • 現實中的類並不完全等於程序中的類,比如現實中的公司類,在程序中有時需要拆分成部門類,業務類等;
  • 有時為了編程需求,程序中也可能會定義現實中不存在的類,比如策略類,現實中並不存在,但是在程序中卻是一個很常見的類

函數 V.S 方法

方法(關聯方法)將其第一個參數關聯到它所屬的實例,因此無需提供這個參數。當然可以將屬性關聯到一個普通函數,但這樣就沒有特殊的self參數了

舉個例子:

1、類屬性關聯到函數:

class Class:
    def method(self):
        print("I have a self")
def function():
    print("I don‘t have self...")
instance=Class()
instance.method()
#輸出結果
I have a self

instance.method=function
instance.method()
#輸出結果
I don‘t have self...

註意:有沒有參數self並不取決於instance.method的調用方法

2、讓另一個變量指向同一個方法

class Class:
    def method(self):
        print("I have a self")
def function():
    print("I don‘t have self...")
instance=Class()
ins=instance.method
ins()

#輸出結果
I have a self

雖然最後一個方法調用起來看起來像函數調用,但變量ins指向的是關聯的方法instance.method,這意味著它也能夠訪問參數self(即它也被關聯到類的實例)

Mark on 2018.04.12

002--對象和類