博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python 类学习
阅读量:6488 次
发布时间:2019-06-24

本文共 4175 字,大约阅读时间需要 13 分钟。

Python 的 Class 比较特别,和我们习惯的静态语言类型定义有很大区别。

1. 使用一个名为 __init__ 的方法来完成初始化。
2. 使用一个名为 __del__ 的方法来完成类似析购操作。
3. 所有的实例方法都拥有一个 self 参数来传递当前实例,类似于 this。
4. 可以使用 __class__ 来访问类型成员

Class 有一些特殊的属性,便于我们获得一些额外的信息。>>>>>> class MyClass(object): """This is MyClass's Docoment""" def __init__(self): self.i = 1234 >>>>>> MyClass.__doc__ # 类型帮助信息 "This is MyClass's Docoment""This is MyClass's Docoment" >>>>>> MyClass.__name__ # 类型名称 'MyClass' >>>>>> MyClass.__module__ # 类型所在模块 '__main__' >>>>>> MyClass.__bases__ # 类型所继承的基类(Python 支持多继承) (
,) >>>>>> MyClass.__dict__ # 类型字典,存储所有类型成员信息
>>>>>> #以下是实例拥有的属性 >>>>>> MyClass().__class__ # 实例的类型
>>>>>> MyClass().__module__ # 实例类型所在模块 '__main__' >>>>>> MyClass().__dict__ # 对象字典,存储所有实例成员信息 {
'i': 1234} >>>>>>
继承Python 支持多继承,但有几点需要注意:1. 基类 __init__ / __del__ 需显示调用。2. 继承方法的调用和基类声明顺序有关。>>>>>> class Base1: def __init__(self): print "Base1" def test(self): print "Base1 test" >>>>>> class Base2: def __init__(self): print "Base2" def test(self): print "Base2 test" >>>>>> class MyClass(Base2,Base1): def __init__(self): Base1.__init__(self) Base2.__init__(self) print "MyClass" >>>>>> a = MyClass() Base1 Base2 MyClass >>>>>> a.test() Base2 test >>>>>> # 下面把 Base1 放在前面 >>>>>> class MyClass(Base1,Base2): def __init__(self): Base1.__init__(self) Base2.__init__(self) print "MyClass" >>>>>> a = MyClass() Base1 Base2 MyClass >>>>>> a.test() Base1 test >>>>>>
成员Python Class 同样包含类型和实例两种成员。>>>>>> class Class1: i = 123 # 类成员 def __init__(self): self.i = 100 # 实例成员 >>>>>> print Class1.i 123 >>>>>> print Class1().i 100 >>>>>>
有几个很 "特殊" 的 "规则" 需要注意。(1) 我们可以通过实例引用访问类型成员。因此下面的例子中 self.i 实际指向 Class1.i,直到我们为实例新增了一个成员 i。>>>>>> class Class1: i = 123 def __init__(self): print self.i print hex(id(self.i)) >>>>>> hex(id(Class1.i)) # 显示 Class1.i 的地址 '0xab5860' >>>>>> a = Class1() # 创建 Class1 实例,我们会发现 self.i 实际指向 Class1.i 123 0xab5860 >>>>>> Class1.__dict__ # 显示 Class1 成员 {
'i': 123, '__module__': '__main__', '__doc__': None, '__init__':
} >>>>>> a.__dict__ # 显示实例成员 {} >>>>>> a.i = 100 # 为实例新增加一个成员i >>>>>> hex(id(a.i)) # 显示新成员i的地址 '0xab5974' >>>>>> a.__dict__ # 显示实例成员 {
'i': 100} >>>>>>(2) 调用类型内部方法,需要省略 self 参数。>>>>>> class Class1: def __init__(self): self.__test("Hello Python") def __test(self, s): print s >>>>>> Class1() Hello Python <__main__.Class1 instance at 0x00DC3800> >>>>>>我们可以在成员名称前添加 "__" 使其成为私有成员。>>>>>> class Class1: __i = 123 def __init__(self): self.__x = 0 def __test(self): print id(self) >>>>>> Class1.i Traceback (most recent call last): File "
", line 1, in
Class1.i AttributeError: class Class1 has no attribute 'i' >>>>>> Class1().__x Traceback (most recent call last): File "
", line 1, in
Class1().__x AttributeError: Class1 instance has no attribute '__x' >>>>>> Class1().__test() Traceback (most recent call last): File "
", line 1, in
Class1().__test() AttributeError: Class1 instance has no attribute '__test' >>>>>>事实上这只是一种规则,并不是编译器上的限制。我们依然可以用特殊的语法来访问私有成员。>>>>>> Class1._Class1__i 123 >>>>>> a = Class1() >>>>>> a._Class1__x 0 >>>>>> a._Class1__test() 14432256 >>>>>>除了静态(类型)字段,我们还可以定义静态方法。>>>>>> class Class1: @staticmethod def test(): print "In Static method" >>>>>> Class1.test() In Static method >>>>>>从设计的角度,或许更希望用属性(property)来代替字段(field)。>>>>>> class Class1: def __init__(self): self.__i = 1234 def getI(self): return self.__i def setI(self, value): self.__i = value def delI(self): del self.__i I = property(getI, setI, delI, "Property I") >>>>>> a = Class1() >>>>>> a.I 1234 >>>>>> a.I = 1000 >>>>>> a.I 1000 如果只是 readonly property,还可以用另外一种方式。>>>>>> class Class1: def __init__(self): self.__i = 1234 @property def I(self): return self.__i >>>>>> a = Class1() >>>>>> a.I 1234 用 __getitem__ 和 __setitem__ 可以实现 C# 索引器的功能。>>>>>> class Class1: def __init__(self): self.__x = ["a", "b", "c"] def __getitem__(self, key): return self.__x[key] def __setitem__(self, key, value): self.__x[key] = value >>>>>> a = Class1() >>>>>> a[1] 'b' >>>>>> a[1] = "xxx" >>>>>> a[1] 'xxx' >>>>>>

 

转载于:https://www.cnblogs.com/Bbrook/p/4355314.html

你可能感兴趣的文章
深入Java -JVM 垃圾回收
查看>>
web性能測試工具-沒還有實驗-URL收集_无需整理
查看>>
测试过程中的防忽悠沟通法
查看>>
第五章 文本编辑器 vi 命令-centos7.5知识
查看>>
我的友情链接
查看>>
小型车、中型车、大型车、重型车的区分和定义见下表:
查看>>
工作多年的.NET程序员,是否建立了自己的开发知识库?分享制作电子书的经验...
查看>>
网络端口号大全
查看>>
非常不错的sharepoint webpart工具集
查看>>
腾讯微博Android客户端开发——OAuth认证介绍
查看>>
UIView的属性使用
查看>>
关于linux内核模块的装载过程
查看>>
linux下gcc升级
查看>>
zabbix的安装监控windows,linux操作流程
查看>>
segue和delegate实现两个页面传值
查看>>
Windows中安装Emacs
查看>>
谷歌发布“虚拟现实化”游戏 Ingress
查看>>
php设计模式的六大原则(二):开闭原则
查看>>
JPA在MySQL中自动建表
查看>>
svn版本库合并
查看>>