方法 (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 本身是绑定关系,属于方法。