1. 程式人生 > >python基礎8

python基礎8

1.使用兩個_變成了私有的變數,在Python中,變數名類似__xxx__的,也就是以雙下劃線開頭,並且以雙下劃線結尾的,是特殊變數,特殊變數是可以直接訪問的,不是private變數。
class Student(object):

def __init__(self, name, score):
    self.__name = name
    self.__score = score

def print_score(self):
    print('%s: %s' % (self.__name, self.__score))

#通過set方法進行修改物件的資料
def set_score(self, score):
    self.__score = score

2.使用一個_表示的是一種約定俗成的規則,意思就是,“雖然我可以被訪問,但是,請把我視為私有變數,不要隨意訪問”。
雙下劃線開頭的例項變數也是能從外部訪問的。不能直接訪問__name是因為Python直譯器對外把__name變數改成了_Student__name,所以,仍然可以通過_Student__name來訪問__name變數:

>>> bart._Student__name  #物件._類名_屬性  的方式進行訪問

‘Bart Simpson’

注意錯誤寫法:

>>> bart = Student('Bart Simpson', 59)
>>> bart.get_name()

‘Bart Simpson’

>>> bart.__name = 'New Name' # 設定__name變數!
>>> bart.__name

‘New Name’
表面上看,外部程式碼“成功”地設定了__name變數,但實際上這個__name變數和class內部的__name變數不是一個變數!內部的__name變數已經被Python直譯器自動改成了_Student__name,而外部程式碼給bart新增了一個__name變數。

3.物件的繼承

class Animal(object):
	def run(self):
	    print('Animal is running...')

可以直接從Animal類繼承:

class Dog(Animal):
#對子類增加一些方法
  def run(self):
    print('Dog is running...')

def eat(self):
    print('Eating meat...')


class Cat(Animal):
   pass

判斷一個變數是否是某個型別可以用isinstance()判斷:

>>> isinstance(a, list)
True
>>> isinstance(b, Animal)
True
>>> isinstance(c, Dog)

4.進行物件型別判斷

type(123)=type(12334)  #True
type(123)==int
type('abc')==str

進行類型別判斷,可以用於繼承類的判斷。也可以用於代替type()型別的判斷

>>> a = Animal()
>>> d = Dog()
>>> h = Husky()
>>> isinstance(h, Husky)

>>> isinstance([1, 2, 3], (list, tuple))
True
>>> isinstance((1, 2, 3), (list, tuple))
True

5.使用dir()可以獲取一個物件的所有的屬性和方法

>>> dir("123")
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getat
tribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__'
, '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__',
'__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'e
ncode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isascii', 'isdecimal',
'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lo
wer', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'spli
t', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

因為__xxx__的屬性和方法在python中都是具有特殊用途的。因此可以在類中進行重寫這樣的方法
下面的兩個方法是等價的:

>>> len('ABC')
3
>>> 'ABC'.__len__()
3

我們自己寫的類,如果也想用len(myObj)的話,就自己寫一個__len__()方法:

>>> class MyDog(object):
    def __len__(self):
    return 100

>>> dog = MyDog()
>>> len(dog)
100

6.進行檢測屬性

>>> hasattr(obj, 'x') # 有屬性'x'嗎?
True
>>> obj.x
9
>>> hasattr(obj, 'y') # 有屬性'y'嗎?
False
>>> setattr(obj, 'y', 19) # 設定一個屬性'y'
>>> hasattr(obj, 'y') # 有屬性'y'嗎?
True
>>> getattr(obj, 'y') # 獲取屬性'y'
19
>>> obj.y # 獲取屬性'y'
19

如果試圖獲取不存在的屬性,會丟擲AttributeError的錯誤:

>>> getattr(obj, 'z') # 獲取屬性'z'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'MyObject' object has no attribute 'z'

可以傳入一個default引數,如果屬性不存在,就返回預設值:

>>> getattr(obj, 'z', 404) # 獲取屬性'z',如果不存在,返回預設值404
404

也可以獲得物件的方法:

>>> hasattr(obj, 'power') # 有屬性'power'嗎?
True
>>> getattr(obj, 'power') # 獲取屬性'power'
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn = getattr(obj, 'power') # 獲取屬性'power'並賦值到變數fn
>>> fn # fn指向obj.power
<bound method MyObject.power of <__main__.MyObject object at 0x10077a6a0>>
>>> fn() # 呼叫fn()與呼叫obj.power()是一樣的
81