光棍节就要到了,要不要给你介绍个 Python 对象?| CSDN 博文精选
作者 | 天元浪子
责编 | 刘静
出品 | CSDN 博客
class A:def __init__(self):""" 构造函数"""self.a = 10 # 定义了一个成员变量a def getA(self):"""成员函数"""print("a=%d" % self.a)def __del__():"""析构函数"""print("delete object")a = A()
a.getA()
当类被实例化为对象时,首先执行构造函数,当对象被销毁时,会自动执行析构函数。一般的,我们会在构造函数中进行初始化工作,在析构函数中进行清理工作。
>>> class A:pass>>> a = A()
>>> del a
>>> a
Traceback (most recent call last):File "<pyshell#70>", line 1, in <module>a
NameError: name 'a' is not defined
>>> class B:def __del__(self):print('执行析构函数,清理现场')>>> b = B()
>>> del b
执行析构函数,清理现场
>>> b
Traceback (most recent call last):File "<pyshell#75>", line 1, in <module>b
NameError: name 'b' is not defined
在PY2中,类有新式类和旧式类两种。新式类需要继承自虚类Object,旧式类则不需要。PY2中类的写法有三种:
class A(object):新式类写法
class A():旧式类写法
class A:旧式类写法
在PY3中,只有新式类,不再支持旧式类。你如果习惯继承Object的写法,也完全没有问题。上面三种写法在PY3中都被解释成新式类。新式类和旧式类的主要区别是:
新式类可以继承Object的构造函数和析构函数,如果类的构造和析构函数没有特别的工作,可以省略。而旧式类则不能:
class A():def print(self):print("I am A")class B(A):def __init__(self):A.__init__(self)
b = B()
class A(object):def print(self):print("I am A")class B(A):def __init__(self):A.__init__(self)
b = B()
新式类可以使用super:
class A(object):def print(self):print("I am A")class B(A):def __init__(self):super(A, self).__init__()
b = B()
多重继承时,各父类的初始化和函数查找顺序不同:旧式类为深度优先继承,新式类为广度优先继承。
>>> class A:static_x = 10 # 静态变量def __init__(self):self.instance_y = 5 # 实例变量>>> a = A()
>>> a.static_x
10
>>> a.instance_y
5
>>> A.static_x
10
>>> A.instance_y
Traceback (most recent call last):File "<pyshell#89>", line 1, in <module>A.instance_y
AttributeError: type object 'A' has no attribute 'instance_y'
class A:static_x= 10def __init__(self):self.y = 10@staticmethoddef staticFuc():print(A.static_x)@classmethoddef classFuc(cls):print(cls.static_x)A.staticFuc()
A.classFuc()
Staticmethod 函数不能使用Self参数,因此不成访问任何成员变量,只能通过类名访问类的静态变量。
class Animal:def eat(self):print('我能吃')class Brid(Animal):def __init__(self):Animal.__init__(self)def fly(self):print('我会飞')brid = Brid()
brid.eat()
brid.fly()
class Deer:def showHorns(self):print('我有鹿角')class Horse:def showFace(self):print('我有马脸')class Cow:def showHoof(self):print('我有牛蹄')class Donkey:def showTail(self):print('我有驴尾')class Milu(Deer, Horse, Cow, Donkey): # 多继承派生出一个四不像类def __init__(self):Deer.__init__(self)Horse.__init__(self)Cow.__init__(self)Donkey.__init__(self)milu = Milu()
milu.showHorns()
milu.showFace()
milu.showHoof()
milu.showTail()
不管是单继承还是多继承,都可以在派生类中重写父类的函数——这叫做覆盖。
公有成员:对类外部的任何代码可见;
保护成员:对类外部的任何代码都不可见,但对派生类可见;
私有成员:对类外部及派生类都不可见。
- 以英文字母开头的成员为公有成员
- 以一个下划线开头的成员为保护成员
- 以两个下划线开关的成员为私有成员
>>> class A(object):def __init__(self, a, b, c):self.a = 10 # 公有self._b = b # 保护self.__c = c # 私有def getA(self): # 公有return self.adef setA(self, a): # 公有self.a = adef getB(self): # 公有return self._bdef _setB(self, b): # 保护self._b = bdef getC(self): # 公有return self.__cdef __setC(self, c): # 私有self.__c = c>>> a = A(10, 20, 30)
>>> class B(A):pass
>>> b = B(10, 20, 30)
>>> a.a
10
>>> a.getA()
10
>>> a.setA(5)
>>> a.a
5
>>> b.a
10
>>> b.getA()
10
>>> b.setA(5)
>>> b.a
5
>>> a.__c
Traceback (most recent call last):File "<pyshell#85>", line 1, in <module>a.__c
AttributeError: 'A' object has no attribute '__c'
>>> a.getC()
30
>>> a.__setC(5)
Traceback (most recent call last):File "<pyshell#87>", line 1, in <module>a.__setC(5)
AttributeError: 'A' object has no attribute '__setC'
>>> b.__c
Traceback (most recent call last):File "<pyshell#88>", line 1, in <module>b.__c
AttributeError: 'B' object has no attribute '__c'
>>> b.getC()
30
>>> b.__setC()
Traceback (most recent call last):File "<pyshell#90>", line 1, in <module>b.__setC()
AttributeError: 'B' object has no attribute '__setC'
私有成员的访问规则也与C++相同。那我为什么跳过保护成员了?来试试吧:
>>> a._b
20
>>> a._setB(5)
>>> a._b
5
看到这里就已经不对了,应该只有类内部的代码和派生类能使用啊,怎么可以直接用了呢?是的,Python的保护成员访问规则与C++的确实不一样。那 Python 的保护成员是什么样的机制呢?原来,在 Python 的OOP中,保护成员公有成员没有任何区别。保护规则仅适用于 from xxx import * 这一种情况。
testA.py
class A(object):passclass _B(object):pass
testB.py
from testA import *a = A()
b = _B()
Traceback (most recent call last):File "testB.py", line 4, in <module>b = _B()
NameError: name '_B' is not defined
from testA import A, _Ba = A()
b = _B()
import testAa = testA.A()
b = testA._B()
class H2O(object):def what(self):print("I am H2O")class Water(H2O):def what(self):print("I am water")class Ice(H2O):def what(self):print("I am ice")class WaterVapor(H2O):def what(self):print("I am water vapor");def what(obj):obj.what()objs = [H2O(), Water(), Ice(), WaterVapor()]for obj in objs:what(obj)
>>> import abc
>>> class A(object, metaclass=abc.ABCMeta):@abc.abstractmethoddef a(self):pass@abc.abstractmethoddef b(self):pass>>> class C(A):def a(self):print("a")>>> c = C()
Traceback (most recent call last):File "<pyshell#127>", line 1, in <module>c = C()
TypeError: Can't instantiate abstract class C with abstract methods b
单例模式
def Singleton(cls):_instance = {}def _singleton(*args, **kargs):if cls not in _instance:_instance[cls] = cls(*args, **kargs)return _instance[cls]return _singleton@Singleton
class Config(object):passcfg1 = Config()
cfg2 = Config()print(cfg1 is cfg2)
后记
【END】
Python学习方法,Python入门须知!(内附python教程分享)
https://edu.csdn.net/topic/python115?utm_source=csdn_bw
热 文 推 荐
☞
光棍节就要到了,要不要给你介绍个 Python 对象?| CSDN 博文精选相关推荐
- 光棍节就要到了,要不要给你介绍个 python 对象?
文章目录 1. 前言 2. 类和对象的概念 3. 类的成员 4. 新式类和旧式类 5. 静态变量和实例变量 6. 静态函数 7. 面向对象三要素 (1) 继承 (2) 封装 (3) 多态 8. 抽象类 ...
- 光棍节,我与LoveGate相伴
老朋友,你好吗?好久不见了,你又长胖了不少-! 昨天(12日)才知道,11月11日是"光棍节",也是在那一天,潜藏在实验室的"爱情"开始了疯狂的爆发.所有开着的 ...
- 光棍节程序员闯关秀(总共10关)
程序员闯关大挑战: https://1111.segmentfault.com/ 仓鼠演示7k7k.4399小游戏: http://cdn.abowman.com/widgets/hamster/ha ...
- 光棍节,猪我生日快乐!
不是光棍,却比光棍更爱过光棍节,无它,因为这天是俺生日!
- 祝所有51cto的朋友光棍节快乐
又是一年一度的光棍节,也不知道是谁发明的这个破节日,想想以前在学校里面没到今天的晚上就是一群哥们出去喝酒,其实大部分都不是光棍也来凑热闹.现在已经没有那样的机会了,祝各位51cto的朋友节日快乐,光棍 ...
- FW : 关于光棍节
中央关于庆祝光棍节的文件 致所有未婚的同学: 群中央,群务院: 我们正处于结婚时代的初级阶段,经过二十几年的努力,虽然取得了结识众多异性的巨大成就,但是人口众多,人均资源相对短缺,局部 ...
- 《光棍节程序员闯关秀》闯关攻略
https://1111.segmentfault.com<光棍节程序员闯关秀> 程序员们,欢迎来攻!!! 在之前的基础上,重新整理了一遍,之前才闯到第8 ...
- [2017.11.11特辑]以一个光棍节表白案例浅谈ECMAScript6模块化的使用方法
双十一,购物节与光棍节,在这个特殊的日子里研究了一下模块化开发的我,突然想结合这个日子,以一个表白的例子浅谈es6模块化的用法. 在之前的 javascript 中一直是没有模块系统的,随着JavaS ...
- 11-11 又是一年光棍节!
11月11日,光棍节,没有哪一天比这一天更形象.更贴切了.当光棍成了"光贵",王老五也有了黄金级和钻石级之分的今天,"光棍节"自然而然地流行开来."光 ...
最新文章
- Python培训教程分享:有哪些值得使用的爬虫开源项目?
- 深入解析String#intern
- Centos下本地连接postgresql时出现认证错误的问题
- vue指令写在html中的原理,详解Vue中的MVVM原理和实现方法
- datasnap的线程池
- Codeforces Round #730 (Div. 2) D2. RPD and Rap Sheet (Hard Version) 交互 + k进制的转换
- deno mysql_从 Node 到 Deno
- 大三,一点回忆,一点难忘
- 怎么样配置java的jdk_如何安装java中的JDK以及配置
- Python 基础起步(一)写在开篇的话,写给同为小白的你
- CAD工具——批量打印
- 【Ubuntu】QT程序 could not find or load the Qt platform plugin “xcb“ in “报错解决
- 页面最上方的搜索和logo叫什么_网页顶部导航栏设计总结
- 源译识 | 征集开源许可证中文译文,欢迎大家译起来!
- Android上传图片到七牛云
- (PG\SE\SSE\PL\PM\PD\UI\QA等)软件行业人员职位缩写或简称以及职责划分
- mysql修复损坏表_在MySQL中,如何修复损坏的表
- HashSet里的元素是不能重复的,那用什么方法来区分重复与否呢?
- 【ACL管理与配置(ACL规则编号、通配符、ACL的分类)】(上)-20211214
- java用监听捕捉点_使用Robot类创建自己的Java版屏幕捕捉程序