Python 中的类、对象和继承
类
Python中,类的命名使用帕斯卡命名方式,即首字母大写。
Python中定义类的方式如下:
class 类名([父类名[,父类名[,...]]]):
pass
省略父类名表示该类直接继承自object
,类的实例化如下:
class Person():
def __init__(self):
pass
person=Person()
__init__()
是类的构造函数,在实例化时调用,它的参数self
表示类实例。
类中的字段
字段的访问级别:
- Python中以双下划线开头的字段访问级别是private;
- Python中以下划线开头的字段访问级别是protected;
- Python中未以下划线开头的字段的访问级别是public;
上述访问级别更多的是一种编程约定,即便是以双下划线开头的字段,在类的外部也是可以访问的,但不建议这么做。示例代码如下:
class Person():
age = 24
_name = 'person'
__family_name = 'securate'
def __init__(self):
print('Person init')
在上图中,我们可以看到类中并没有出现一双下划线开头的字段__family_name,而多出一个_Person__family_name。说明类实例不可以直接访问__family_name,但可以通过
实例名._Person__family_name
的方式来访问。
上述三种类型的变量均可以通过类或类实例进行访问。通过self
定义的变量只能通过类实例进行访问,如self.country
,变量country
只能通过类实例进行访问。
类中的方法
Python中方法名均为小写字母,不同单词间以下划线进行分割。
方法的覆盖
Python类中没有方法的重载,对于具有相同名称的方法,后面的定义会覆盖掉前面的定义;子类会覆盖父类中同名的方法。在Person类中定义两个同名方法say
:
def say(self, message):
print(message)
def say(self, info):
print('second: '+info)
person=Person()
person.say('invoke')
从程序运行结果可知,调用的是定义在后面的say(self, info)
方法。
特殊方法
以双下划线开头和结尾的方法属于特殊方法,如:__init__(self)
、__call__(self)
等内置方法。在我们自己定义方法时不建议采取这种方式。
方法的访问级别
- Python中以双下划线开头的方法访问级别是private;
- Python中以下划线开头的方法访问级别是protected;
- Python中未以下划线开头的方法的访问级别是public;
和字段类似,上述访问级别也只是一种编程约定,即便是以双下划线开头的方法,在类的外部也是可以访问的,但不建议这么做。
实例方法
定义方法时,没有装饰器修饰且带有参数的(可以不是self),即为实例方法。
类外部通过类实例来调用,类内部通过self.方法名
来调用。
def method(self):
pass
@classmethod
@classmethod是Python中的装饰器。
使用@classmethod
修饰的方法,必须要带参数(默认参数名是cls),该参数表示类自身。可以通过类自身或者类实例调用@classmethod
修饰的方法。在@classmethod
修饰的方法中无法访问实例成员,但可以通过cls或者类名访问类中的字段。
@staticmethod
使用@staticmethod
修饰的方法可以没有参数,可以通过类或者类实例调用。在@staticmethod
修饰的方法中,无法访问类中的实例成员,可以通过类名访问类中的字段。
继承
定义一个Chinese类,继承自Person类:
class Chinese(Person):
def __init__(self):
pass
chinese=Chinese()
从Chinese类型的实例中,我们可以看到Chinese类继承了除
country
之外的所有字段。子类还会继承父类中的函数,若子类没有实现自己的构造函数(
__init__(self)
),那么在实例化子类时会调用父类的构造函数。
子类间的类型转换
class Person():
def __init__(self):
pass
def convert(self, class_type):
if issubclass(class_type, Person):
return (class_type)(self)
class Chinese(Person):
def __init__(self, convert=None):
pass
def cn_method(self):
print('chinese')
class Japanese(Person):
def __init__(self, convert=None):
pass
执行类型转换:
jap = Japanese()
cn = jap.convert(Chinese)
cn.cn_method()
可以看到,根据Japanese实例得到了Chinese类型实例。这里的转换只是获取了Chinese类型的实例cn,而原有的Japanese类型实例依然存在于内存中。
推荐阅读
Python风格规范
Python进阶
参考文章:
飘逸的python - @staticmethod和@classmethod的作用与区别
Difference between @staticmethod and @classmethod in Python
推荐阅读
-
C++ 中的抽象类和抽象方法
-
通过 Vue 中的 v-bind 增强样式控制--(通过 v-bind 操作类和操作样式属性的详细说明,附示例和代码)
-
C++ 学习笔记 ----8, 掌握类和对象 (VII) ---- 构建稳固的接口
-
Python 阅读 pdf 中的文本和表格
-
C++ 学习笔记 ----8, 掌握类和对象 (II) ---- 更多关于成员函数的知识 (2)
-
Java 8新特性探究(十三)JavaFX 8新特性以及开发2048游戏-JavaFX历史## 跟java在服务器端和web端成绩相比,桌面一直是java的软肋,于是Sun公司在2008年推出JavaFX,弥补桌面软件的缺陷,请看下图JavaFX一路走过来的改进 从上图看出,一开始推出时候,开发者需使用一种名为JavaFX Script的静态的、声明式的编程语言来开发JavaFX应用程序。因为JavaFX Script将会被编译为Java bytecode,程序员可以使用Java代码代替。 JavaFX 2.0之后的版本摒弃了JavaFX Script语言,而作为一个Java API来使用。因此使用JavaFX平台实现的应用程序将直接通过标准Java代码来实现。 JavaFX 2.0 包含非常丰富的 UI 控件、图形和多媒体特性用于简化可视化应用的开发,WebView可直接在应用中嵌入网页;另外 2.0 版本允许使用 FXML 进行 UI 定义,这是一个脚本化基于 XML 的标识语言。 从JDK 7u6开始,JavaFx就与JDK捆绑在一起了,JavaFX团队称,下一个版本将是8.0,目前所有的工作都已经围绕8.0库进行。这是因为JavaFX将捆绑在Java 8中,因此该团队决定跳过几个版本号,迎头赶上Java 8。 ##JavaFx8的新特性 ## ###全新现代主题:Modena 新的Modena主题来替换原来的Caspian主题。不过在Application的start方法中,可以通过setUserAgentStylesheet(STYLESHEET_CASPIAN)来继续使用Caspian主题。 参考http://fxexperience.com/2013/03/modena-theme-update/ ###JavaFX 3D 在JavaFX8中提供了3D图像处理API,包括Shape3D (Box, Cylinder, MeshView, Sphere子类),SubScene, Material, PickResult, LightBase (AmbientLight 和PointLight子类),SceneAntialiasing等。Camera类也得到了更新。从JavaDoc中可以找到更多信息。 ###富文本 强化了富文本的支持 ###TreeTableView ###日期控件DatePicker 增加日期控件 ###用于 CSS 结构的公共 API
-
解析Python中的类的方法和概念
-
Python中的大顶堆和小顶堆:实现从小到大排序的大顶堆
-
使用matplotlib在Python中实现正弦信号的时域波形和频谱图示例
-
深入理解JSP中的request和response内置对象