方法 (method) 与函数 (function)

1. Python 基本概念

函数是带名字的代码块,用于完成具体的工作。

模块是扩展名为 .py 的文件,包含要导入到程序中的代码。

根据类来创建对象被称为实例化,这让你能够使用类的实例。

类中的函数称为方法。你学到的有关函数的一切都适用于方法,唯一重要的差别是调用方法的方式。

方法 __init__() 是一个特殊的方法,每当你根据类创建新实例时,Python 都会自动运行它。在这个方法的名称中,开头和末尾各有两个下划线,这是一种约定,旨在避免 Python 默认方法与普通方法发生名称冲突。

2. 方法 (method) 与函数 (function) 的选择

模块下要实现一个功能,可以有两种选择,1. 在类内实现一个方法,2. 在类外实现一个函数。

代码的结果是一样的,是使用了不同的方式去实现。代码量较少时,直接写函数比较方便;代码量较多时,封装起来方便后期维护,不同量级的事情有不同量级的处理方式。

3. 方法 (method) 与函数 (function) 区别

方法是绑定了实例的函数,方法是对象调用的函数。方法就是函数,只是比较特殊的函数,方法就是属于对象的函数。

函数实现的是某个独立的功能,可以直接调用,而方法是实现类中的一个行为,是类的一部分,不能脱离类单独使用。

方法可以操作类内部的数据。对象是类的实例化,类定义了一个数据类型,而对象是该数据类型的一个实例化。

类里叫方法,类外叫函数。方法和对象相关,函数和对象无关。

函数是这类事情是怎么干的,方法是某个对象是如何干这类事情的。

Java 中只有方法,C 中只有函数,C++ 里取决于是否在类中,在 Python 中,既有面向过程,又有面向对象,所以在 Python 既有函数,又有方法。

方法在 C++ 中是被称为成员函数。在 C++ 中的方法和函数的区别,就是成员函数和函数的区别。Java 编程语言只有方法。所以这时候就是静态方法和方法直接的区别。方法可以操作已在类中声明的私有实例 (成员) 数据。其他代码都可以访问公共实例数据。

函数属于整个文件,方法属于某一个类,方法不能离开类,函数可以直接调用,方法必须用对象或者类来调用。

所有的函数都是平行的,函数不存在隶属关系,使用的时候可以直接调用,不可以访问对象中的成员变量。

方法可以没有声明只有实现。方法可以只有声明没有实现,编译不会报错,但是运行会报错。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# Yongqiang Cheng

from __future__ import absolute_import
from __future__ import print_function
from __future__ import division

import os
import sys


def greet_user(username):
    """Display a simple greeting."""
    print("Hello, " + username.title() + "!")


class Dog():
    """A simple attempt to model a dog."""

    def __init__(self, name, age):
        """Initialize name and age attributes."""
        self.name = name
        self.age = age

    def sit(self):
        """Simulate a dog sitting in response to a command."""
        print(self.name.title() + " is now sitting.")

    def roll_over(self):
        """Simulate rolling over in response to a command."""
        print(self.name.title() + " rolled over!")


if __name__ == '__main__':
    current_directory = os.path.dirname(os.path.abspath(__file__))
    print("current_directory:", current_directory)

    greet_user('yongqiang')

    my_dog = Dog('willie', 6)
    your_dog = Dog('lucy', 3)

    print("My dog's name is " + my_dog.name.title() + ".")
    print("My dog is " + str(my_dog.age) + " years old.")
    my_dog.sit()

    print("\nMy dog's name is " + your_dog.name.title() + ".")
    print("My dog is " + str(your_dog.age) + " years old.")
    your_dog.sit()

    print('\n')
    print("greet_user:", greet_user)
    print("my_dog.sit:", my_dog.sit)
    print("my_dog.sit():", my_dog.sit())
    print('\n')
    print("Dog.sit:", Dog.sit)
    print("my_dog.sit:", my_dog.sit)
/usr/bin/python3.5 /home/strong/sunergy_moonergy_work/object_detection_example/yongqiang.py
current_directory: /home/strong/sunergy_moonergy_work/object_detection_example
Hello, Yongqiang!
My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.

My dog's name is Lucy.
My dog is 3 years old.
Lucy is now sitting.


greet_user: <function greet_user at 0x7fa5eb806f28>
my_dog.sit: <bound method Dog.sit of <__main__.Dog object at 0x7fa5ea0bf3c8>>
Willie is now sitting.
my_dog.sit(): None


Dog.sit: <function Dog.sit at 0x7fa5ea0c1268>
my_dog.sit: <bound method Dog.sit of <__main__.Dog object at 0x7fa5ea0bf3c8>>

Process finished with exit code 0

对象.方法名,得到的是方法类型。
类名.方法名,得到的是函数类型。

在 class 内定义的普通方法,是要面向将来实例化对象的,是一个实例方法,属于 method。
在 class 内定义的静态方法,与任何对象都没有联系,等同于是在 class 外定义的 function,它属于函数。
在 class 内定义的类方法,第一个参数必须是 class,它与 class 本身是绑定关系,属于方法。