1. 程式人生 > >Python進階(十二)-淺談python中的方法

Python進階(十二)-淺談python中的方法

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow

也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp

Python進階(十二)-淺談python中的方法

  我們在 class 中定義的例項方法其實也是屬性,它實際上是一個函式物件:

class Person(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
    def
get_grade(self):
return 'A' p1 = Person('Bob', 90) print p1.get_grade # => <bound method Person.get_grade of <__main__.Person object at 0x109e58510>> print p1.get_grade() # => A
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

  也就是說,p1.get_grade 返回的是一個函式物件,但這個函式是一個繫結到例項的函式,p1.get_grade() 才是方法呼叫。
因為方法也是一個屬性,所以,它也可以動態地新增到例項上,只是需要用 types.MethodType() 把一個函式變為一個方法:

import types
def fn_get_grade(self):
    if self.score >= 80:
        return 'A'
    if self.score >= 60:
        return 'B'
    return 'C'

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

p1 = Person('Bob', 90)
p1.get_grade = types.MethodType(fn_get_grade, p1, Person)
print
p1.get_grade() # => A p2 = Person('Alice', 65) print p2.get_grade() # ERROR: AttributeError: 'Person' object has no attribute 'get_grade' # 因為p2例項並沒有繫結get_grade
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

  給一個例項動態新增方法並不常見,直接在class中定義要更直觀。

舉例

  由於屬性可以是普通的值物件,如 str,int 等,也可以是方法,還可以是函式,大家看看下面程式碼的執行結果,請想一想 p1.get_grade 為什麼是函式而不是方法:

class Person(object):
    def __init__(self, name, score):
        self.name = name
        self.score = score
        self.get_grade = lambda: 'A'

p1 = Person('Bob', 90)
print p1.get_grade
print p1.get_grade()
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  直接把 lambda 函式賦值給 self.get_grade 和繫結方法有所不同,函式呼叫不需要傳入 self,但是方法呼叫需要傳入 self。


這裡寫圖片描述

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow

也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp