python 關於物件的幾個重點

A. 物件基本

class Person(object):
  name = ''
  def __init__(self, name):
    self.name = name
  def get_name(self):
    return self.name
  def set_name(self):
    self.name = name

me = Person('eric')
print me.get_name()
--> eric

Important facts:

  • 在Person類別下定義了三個函式 __inti__ ,  get_name,  set_name
  • 每個函式的第一個參數是self, 用來指涉呼叫此函式的物件實體
  • get_name 和 set_name 函式都是Person物件的方法(method), 而name 變數則被稱作是屬性(attribute)
  • __init__ 是此物件的建構子(constructor), 建立物件實體時一定會被呼叫
  • 類別實體的資料並不會互相影響

B. 資訊隱藏

在python中並沒有直接隱藏某個屬性或是方法的辦法(像java中的 protected or private 關鍵字)
如果要做到隱藏的效果, 可以在屬性或是方法前面加上兩個底線的前置字串

ex: 
class Person(object):
  __name = ''
  def __init__(self, name):
    self.__name = name
    self.__initSomething()
  def get_name(self):
    return self.__name
  def set_name(self, name)
    self.__name = name
  def __initSomething(self):
    print 'init something...'

只要是名稱前面加上兩個底線的屬性或方法, 就無法直接透過物件實體存取到
所以假設a是Person的物件實體, a.__name  會回傳 'Person' object has no attribute '__name'
事實上python 只是將它們換了名字  實際上只要這樣就存取得到 a._Person__name
但如此的機制可以防止不小心的存取

C. 物件繼承(inheritance)

class Employee(Person):
  __role = ''
  def __init__(self, name, role):
    self.__name = name
    self.__role = role
  def get_role(self):
    return self.__role
  def set_role(self, role):
    self.__role = role

想保持既有物件類別的一些特性, 然後再加上或是修改物件類別的屬性或是方法, 便可以透過繼承機制

以上的程式碼宣告了一個Employee物件類別, Employee物件類別內並沒有定義get_name方法, 不過類別實體還是可以呼叫之, 因為Employee物件繼承了Person類別, 所以此物件既是Employee類別, 也是Person 類別, 含有Person類別的既有方法, 寫法就如同上面的程式碼  要被繼承的類別放在小括號中

super(Employee, self)  則表示Employee 所繼承的類別, 意即 Person 類別

留言

熱門文章