1. 程式人生 > >python——類(一)

python——類(一)

1〉首先,怎麼寫一個類,用個例子

class Student(object):
    def __init__(self,name,score,gender):
        self.__name=name
        self.__score=score
        self.__gender=gender
    def get_name(self):
        return self.__name
    def print_score(self):
        print('%s:%s'%(self.__name,self.__score))
    def set_score(self,score):
        if 0<=score<=100:
            self.__score=score
        else:
            raise ValueError('bad score')
    def get_grade(self):
        if self.__score>=90:
            return 'A'
        elif self.__score>=60:
            return 'B'
        else:
            return 'C'
    def get_gender(self):
        if self.__gender=='男':
            return 'man'
        elif self.__gender=='女':
            return 'woman'

需要注意的點:

類名後面的(object)是可以忽略的。(只有當子類繼承父類的時候,類名後面的括號裡面是父類的名字,下面會有例子)

def __init__(self){}這個類似建構函式,init前後分別有兩個下劃線,一共有四個下劃線,括號裡面的self是必寫的一個,但是不會用到它(我個人的理解是this,僅僅個人認為)

特別注意get和set方法,和jsp中的方法也類似。


2〉以上僅僅是一個類,下面講講類的繼承和多型:

class Animal(object):
    def run(self):
        print('Animal is running...')
class Dog(Animal):
    def run(self):
        print('Dog is running...')
class Cat(Animal):
    def run(self):
        print('Cat is running...')
def run_twice(animal):
    animal.run()

如上程式碼中Animal是父類,Dog和Cat都是Animal的子類,通過在類名後面+(父類的類名)實現

def run_twice(animal):
    animal.run()
其中,這個函式是實現多型的

>>> run_twice(Animal())
Animal is running...
>>> run_twice(Dog())

Dog is running...

這個是 呼叫的結果


3〉瞭解類屬性和例項屬性:簡單的說 類屬性是在類中直接寫的屬性,例項屬性指在類外重寫的屬性。一般,先看有沒有例項屬性,再看有沒有類屬性。

class CocaCola(object):
    calories=140
    sodium=45
    total_carb=39
    caffeine=34
    def __init__(self,logo_name):
        self.logo_name=logo_name
    def drink(self):
        print('You got{}cal energy!'.format(self.calories))
class zeroCola(CocaCola):
    calories=0
>>> coke_a.drink()

You got0cal energy!

子類會覆蓋父類中相同的屬性的值。


4〉認識除了__init__之外的內建函式

class Employee:
    '所有員工的基類'
    empCount=0
    def __init__(self,name,salary):
        self.name=name
        self.salary=salary
        Employee.empCount+=1
    def displayCount(self):
        print ("Total Employee %d"% Employee.empCount)
    def displayEmployee(self):
        print("Name:",self.name,"Salary:",self.salary)
print("Employee.__doc__:",Employee.__doc__)
print("Employee.__name__:",Employee.__name__)
print("Employee.__module__:",Employee.__module__)
print("Employee.__bases__:",Employee.__bases__)
print("Employee.__dict__:",Employee.__dict__)

結果如下:

Employee.__doc__: 所有員工的基類
Employee.__name__: Employee
Employee.__module__: __main__
Employee.__bases__: (<class 'object'>,)

Employee.__dict__: {'__weakref__': <attribute '__weakref__' of 'Employee' objects>, 'displayCount': <function Employee.displayCount at 0x0000000003570F28>, '__dict__': <attribute '__dict__' of 'Employee' objects>, '__module__': '__main__', '__init__': <function Employee.__init__ at 0x0000000003570EA0>, 'empCount': 0, 'displayEmployee': <function Employee.displayEmployee at 0x0000000003565048>, '__doc__': '所有員工的基類'}

#****************************************************************************

除此之外,我還找到一些

類的專有方法:

  • __init__ : 建構函式,在生成物件時呼叫
  • __del__ : 解構函式,釋放物件時使用
  • __repr__ : 列印,轉換
  • __setitem__ : 按照索引賦值
  • __getitem__: 按照索引獲取值
  • __len__: 獲得長度
  • __cmp__: 比較運算
  • __call__: 函式呼叫
  • __add__: 加運算
  • __sub__: 減運算
  • __mul__: 乘運算
  • __div__: 除運算
  • __mod__: 求餘運算
  • __pow__: 乘方
注意的是:這些都是私有的,外部不能呼叫。