Python学习手册之数据封装、类方法和静态方法

在上一篇文章中,我们介绍了 Python 的内部方法、操作符重载和对象生命周期,现在我们介绍 Python 的数据封装、类方法和静态方法。查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/10017357.html

数据封装
面向对象编程的一个关键部分是封装,它涉及将相关变量和函数打包到一个简单易用的对象(类的一个实例)中。
一个相关的概念是隐藏数据,它隐藏了类的实现细节,并提供一个干净的标准接口。
在其它编程语言中,通常是通过私有方法和属性完成的,这些方法和属性阻止了对类中某些方法和属性的外部访问。
Python 的设计哲学略有不同。它认为 "我们都是成年人",这意味着你不应该对类的访问设计任意的限制。因此,没有任何方法强制方法或属性是严格私有的。

但是,还是有一些方法可以阻止人们访问类的内部私有成员。

弱私有方法和属性在开头只有一个下划线。
这表明它们是私有的,不应该被外部代码使用。但是,它们基本上只有一个约定,并不阻止外部代码访问它们。
它唯一的实际效果是,从模块导入 from module_name import * 不会导入以单个下划线开头的变量。

class Name():
 def __init__(self):
  self.__name = None

 def getName(self):
  return self.__name

 def setName(self, string):
  #判断value的值是不是整型
  if isinstance(string, str):
   self.__name = string
  else:
   print("Error:不是字符串")

m1 = Name()
print(m1.getName())
m1.setName("Lisi")
print(m1.getName())
m1.setName(10086)
m1.__name = "WangWu"
print(m1.__name)

运行结果:

>>>
None
Lisi
Error:不是字符串
WangWu
>>>
上面的例子,属性 __Name 标记为私有,但是还是可以被外部代码访问。

弱私有方法和属性的名称开头有双下划线,这意味着它们不能从类之外被访问。
这样做的目的并不是确保它们是私有的,而是如果又具有相同名称的方法和属性的子类,则可以避免出现 bug
使用这种方法直接访问是无法访问的,但可以通过不同的名称访问。Name 类的私有方法 __privatemethod 可以通过 _Name__privatemethod 方法进行外部访问。

class Name():
 __name = "ZS"
 def print_name(self):
  print(self.__name)

n = Name()
n.print_name()
print(n._Name__name)
print(n.__Name)

运行结果:

>>>
ZS
ZS
AttributeError: ‘Name‘ object has no attribute ‘__Name‘
>>>
基本上,Python 通过内部更改名称以包含类名来保护这些成员。

类方法

目前为止,我们所看到调用对象的方法都是有类的一个实例调用的,然后传递给方法的 self 参数。
类方法是不同的 -- 它们由一个类调用,该类被传递给方法的 cls 参数。
类方法的常见用途是工厂方法,它们使用与传递的类构造函数的参数不同的参数来实例化实例。
类方法被装饰符 @classmethod 标记为类方法。

class Book():
 def __init__(self, title):
  self.title = title

 @classmethod
 def class_method_create(cls, title):
  book = cls(title=title)
  return book

book1 = Book("use instance_method_create book instance:追风筝的人")
book2 = Book.class_method_create("use class_method_create book instance:百年孤独")
print(book1.title)
print(book2.title)

运行结果:

>>>
use instance_method_create book instance:追风筝的人
use class_method_create book instance:百年孤独
>>>

class_method_create 是类方法,它不在类的实例上调用。而是通过类的方法调用,它返回类 cls 的一个新对象。

从技术上将,selfcls 参数只是约定;它可以更改为其他任何东西。但是,这种约定被大多数人遵循。

静态方法
静态方法与类方法相似,只是没有任何附加参数比如 selfcls。它们与属于类函数的使用方法相同。它们被静态方法装饰器 @staticmethod 定义。

class Book():
 def __init__(self, title):
  self.title = title

 @staticmethod
 def static_method_create(title):
  book = Book(title)
  return book

book1 = Book("use instance_method_create book instance:追风筝的人")
book3 = Book.static_method_create("use static_method_create book instance:活着")
print(book1.title)
print(book3.title)

运行结果:

>>>
use instance_method_create book instance:追风筝的人
use static_method_create book instance:活着
>>>

静态方法的行为类似于普通函数,除了不可以从类的实例中调用它们。

“为什么在这个世界上,有95%的人会无法成功,而只有那少数的5%会成功,因为大多数人的心里存在着这三个字:不可能。”

原文地址:https://www.cnblogs.com/dustman/p/10019973.html

时间: 2024-10-10 06:13:30

Python学习手册之数据封装、类方法和静态方法的相关文章

Python学习手册笔记

之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书配套答案请到http://www.hzbook.com/Books/4572.html下载,简单注册即可. 第三章 如何运行程序 impor

《Python学习手册》读书笔记【转载】

转载:http://www.cnblogs.com/wuyuegb2312/archive/2013/02/26/2910908.html 之前为了编写一个svm分词的程序而简单学了下Python,觉得Python很好用,想深入并系统学习一下,了解一些机制,因此开始阅读<Python学习手册(第三版)>.如果只是想快速入门,我在这里推荐了几篇文章,有其他语言编程经验的人简单看一看就可以很快地开始编写Python程序了. 黑体表示章节, 下划线表示可以直接在原文对应位置查到的专有技术名词. 原书

python学习手册

1.GUI开发 python中界面开发使用wxPython库,开发手册 wxPytyhon in action; *  http://wiki.woodpecker.org.cn/moin/WxPythonInAction *  http://blogimg.chinaunix.net/blog/upfile2/090208120235.pdf python学习手册

global语句(python学习手册422页)

# -*- coding: cp936 -*- #python 27 #xiaodeng #global语句(python学习手册422页) #实际上就是一个名为__builtin__的模块,但是必须要import之后才能使用,因为变量名builtin本身并没有预先内置 #global语句,命名空间的声明,告诉python计划生成一个或多个全局变量. #全局变量名小结: #1.全局变量是位于模块文件内部的顶层的变量名 #2.全局变量如果是在函数内被赋值的话,必须要经过global声明 #3.全局

python学习手册——1介绍python对象类型

在python ,数据以对象的形式出现--无论是python提供的内置对象,还是使用python或是像C扩展库这样的扩展语言工具创建的对象.尽管在以后才能确定这一概念,但对象无非是内在中的一部分,包含数值和相关操作的集合. 由于对象是python 最基本的概念,从这一章开始我们将会全面地体验python的内置对象类型. python程序可以分解成模块,语句,表达式以及对象,如下所示: 1.程序由模块构成 2.模块包含语句 3.语句包含表达式 4.表达式建立并处理对象 为什么使用内置类型 1.内置

[读书]Python学习手册--属性管理1

属性管理-特性 一般开发这不必关心属性的实现,对工具的构建这来说,了解这一块对API的灵活性有帮助. 大多数情况下,属性位于对象自身之中,或者继承自对象所派生自的一个类. ----python学习手册 property property(fget=None, fset=None, fdel=None, doc=None) -> property attribute fget is a function to be used for getting an attribute value, and

《Python 学习手册》笔记 1

今天看了 Udacity 的 iOS 学习路线介绍,作者的看法是,最好先学习 Swift,而不是 Objective-C,原因一方面是 Swift 要简单一些,另一方面是因为 Apple 打算用 Swift 作为将来的官方语言取代 OC. 大学里,编程语言课程就是 C 和 C++.我不知道这是谁定的,也许他们有足够充分的理由.但是对于大多数人来说,这两个语言——一个太底层,一个太复杂)其实不见得那么重要.还不如学学 Ruby 和 Python 这样的抽象度更高的解释性语言,易于使用,而且内置了强

python学习手册中的一些易忘的点(4-7部分)

有时间系统看一遍python学习手册,记录一些易忘点 1.python函数高聚合低耦合1)对于输入使用参数并且对于输出使用return2)只有在真正必要的情况下使用全局变量3)不要改变可变类型的参数,除非调用者希望这样做4)每个函数都应该有一个单一的.统一的目标5)每一个函数应该相对较小6)避免直接改变在另一个文件中的变量 2.递归处理任意结构>>> a=[3,[2,[2,3,4],2],1,[1,5,[1,3,3]]]>>> def sumtree(L):...  

分享《Python学习手册(第4版)》高清中文PDF+高清英文PDF+源代码

下载:https://pan.baidu.com/s/1b7P9O6cHVBqce83G-zoJew 更多资料:http://blog.51cto.com/3215120 <Python学习手册(第4版)>高清中文PDF+高清英文PDF+源代码 高清中文PDF,1162页,带书签目录,文字可以复制.高清英文PDF,1594页,带书签目录,文字可以复制.中英文两版对比学习.配套源代码. 其中,中文版如图: 原文地址:http://blog.51cto.com/3215120/2316529