Python编程疑问:为何部分功能实现为Function,部分为Method?
lower是实例方法而非全局函数? 核心原因:面向对象的封装设计
Python是面向对象语言,字符串str本身是一个类,所有字符串都是这个类的实例。把lower这类操作字符串的逻辑做成实例方法,是OOP封装思想的体现——把「字符串数据」和「操作这些数据的方法」绑定在一起,逻辑上更连贯:你要处理某个字符串,就直接在这个字符串实例上调用对应的方法,比如"HELLO".lower(),一眼就能看出来是对这个字符串做转小写操作。
如果做成全局函数lower("HELLO"),虽然功能能实现,但就打破了这种封装,操作和数据分离,不符合Python的OOP设计习惯。
和字符串不可变性的关系?
你的猜测有部分关联,但不是「因为不可变性才做成方法」,而是字符串的不可变性决定了方法必须返回新对象。
Python字符串一旦创建就不能修改,所以lower()不会改变原字符串,而是返回一个新的小写字符串。但这和它是不是方法无关——就算把lower做成全局函数,它也得返回新字符串,不能修改原对象。所以不可变性不是它被设计成方法的原因,只是字符串特性带来的结果。
关于NameError报错
你调用lower(string)时出现NameError: name 'lower' is not defined,完全符合它是实例方法的特性:lower不是全局作用域里的函数,它是str类的属性,只能通过str类的实例(也就是具体的字符串)来调用,或者通过str.lower(string)这种方式(本质是把字符串作为参数传给类方法),但平时没人这么写,都是直接用实例调用。
对比print的设计
print是全局内置函数,因为它的功能是输出任意对象,不属于某个特定类的专属操作——你可以用print输出字符串、数字、列表、自定义对象等等,把它做成全局函数比绑定到某个类上更合理。
内容的提问来源于stack exchange,提问作者Patrick

