iT邦幫忙

0

python 物件導向 疑問

JK 2018-09-19 11:45:032957 瀏覽

在python中所有東西都可以被當成物件,一個物件又包含了屬性及方法,但我不太了解屬性的意思
EX num=7, 7就是一個物件那麼它的屬性是指甚麼呢?

class Person():
    def __init__(self,name):
        self.name=name

在新建一個類別的時候,為何要有 self.name=name這段

1
froce
iT邦大師 1 級 ‧ 2018-09-19 13:01:45
最佳解答

你用了個很難舉例的,所以換個例子。

class Dog():
    def __init__(self, name, age):
        # 設定物件本身(self)屬性(.name/age)為外部參數(name/age)
        self.name = name
        self.age = age
    
    # 叫的方法
    def bark(self, times=1):
        return "汪" * times
    
    # 利用 @property,將方法設定為屬性
    # 你可以看到物件裡面,內部參數的傳遞都是靠self來傳
    @property
    def asHumanAge(self):
        return self.age * 7
        
park = Dog("Park", 3)
print(park.name)
print(park.age)
print(park.bark(3))
print(park.asHumanAge)
# 檢查park這個實例裡面,含有什麼屬性和方法
print(dir(park))

在python中,使用者對於屬性和方法是看不出來區別的,只能看他的用法和是不是callable(後面可以加刮號)來看。

to 小魚:
python的物件裡面,__XXXX__這種的,是內建的方法,有其功用,不理解的話建議不要亂覆寫。
這種的就要記一下。
其他的話通常就記個 @property,頂多多記個 @setter、@classmethod而已。
http://seanlin.logdown.com/posts/221362-python-idioms-14-property
不過python的OOP其實蠻多地方要注意的...
有興趣的話推薦看「流暢的python」這本書,寫越久,懂越多,你就越覺得這是pyer必備之神書。

小魚 iT邦大師 1 級 ‧ 2018-09-19 19:11:03 檢舉

不能亂覆寫?
看起來像是建構子吧?
建構子也算是一種方法吧?
只是那是程式語言事先定義好的方法.

題外話,
你這樣子To照理說是不會看到,
今天是剛好看到 @@

froce iT邦大師 1 級 ‧ 2018-09-20 09:35:43 檢舉

因為有緣就看的到啊,知道你主力不是python。

是建構子沒錯,要覆寫的話,你要知道你在覆寫的東西是什麼,需要產出什麼。
python的OOP為了不要重造輪子,這邊規定的比較多,而且入門書通常都沒寫。

JK iT邦新手 5 級 ‧ 2018-09-20 13:48:48 檢舉

謝謝回答,我懂了!!

1
小魚
iT邦大師 1 級 ‧ 2018-09-19 12:07:15

以這個例子而言

Person是物件
name是屬性
init 是方法
self.name是Person物件的name屬性
= name 後面那個name是你帶入__init__方法後面的那個name

不過這些我都沒在記,
會寫程式就好了記那麼多名詞做什麼...

JK iT邦新手 5 級 ‧ 2018-09-19 12:25:22 檢舉

因為剛開始學程式,看到物件導向這部分時候有點混亂才想把它搞懂,所以說那兩個name是不同的嗎。name是他的屬性這我知道那換到前面哪個例子的屬性我就搞不懂了

小魚 iT邦大師 1 級 ‧ 2018-09-19 12:48:05 檢舉

num = 7
num算一個屬性(或稱變數)吧,
7是我們給的值.
這只是單純的變數賦值而已,
沒特別用到什麼物件.

JK iT邦新手 5 級 ‧ 2018-09-20 13:47:13 檢舉

謝謝回答,我大概了解了

0
褲底農民
iT邦新手 5 級 ‧ 2018-11-11 05:38:34

雖然已有解答
但我也提供一個例子供大家參考
因為我也是初學者
當初也在類別class這東西上迷糊了半天

class Round:
    def __init__(self, r):
        self.radius = r
        self.PI = 3.14
        print('我出現了')

    def per(self):
        return self.radius*2*self.PI

    def area(self):
        return self.radius**2*self.PI

obj = Round(5)
obj2 = Round(10)
print(obj.per())
print(obj.area())

首先針對問題:

在新建一個類別的時候,為何要有 self.name=name這段

回答:

首先你要了解`__init__`的意思
__init__當你實體化時會自動執行
在我的例子中我創了兩個實體化的物件
所以當你執行時,應該會有兩個"我出現了"
右邊的name就是你實體化輸入的參數
可以用我的例子比對一下
左邊的self.name就是可以讓class底下的函數直接使用
這樣你在寫函數會省去很多麻煩,多用幾次就能明白

Round(圓)這個類別有半徑和314這兩個屬性
底下有周長和面積兩個方法

從我的例子就可以了解:
> 屬性就是類別裡重要且可重複使用的
> 如何設定這些程式碼才能簡潔就是個人功力

簡單說python所有東西都能成為物件(類別)
例如我們要寫個銀行類別
重要屬性戶名和戶內金額
功能可能有存款和提
甚至一個橘子也可以是物件
屬性有甜度、重量
以此為依據
功能也許需要分類高級和次級的橘子

所有不是有人說程式幾乎無所不能
重點看你能不能實做出來罷了

我要發表回答

立即登入回答