继承关系
#! /usr/bin/python3
# 继承自object的叫新式类,否则称之为经典类(旧式类)
# Python3中,没有继承自object的类,默认也会继承自object;但Python2则不会
# 为了兼容性考虑,建议继承自object
class Animal(object):
# 类属性
count = 0
# 初始化的时候调用
def __init__(self, name):
# 用统计实例对象的个数
#可以用 `类名.count` 或 `实例instance.count` 来访问
# 但赋值必须是 `类名.count = xx` 的这种方式
Animal.count += 1
# 添加公开属性
self.name = name
# 添加私有属性
self.__sex = 'male'
# 该方法可以在打印对象时调用
def __str__(self):
return "该动物是 %s" %self.name
# 类方法,要用`@classmethod`标记
@classmethod
def showInstanceNum(cls):
print("当前实例的个数是 %d" %Animal.count)
# 私有属性和方法,是不能被外界和子类访问到的
# 可以通过创建公开方法的方式去获取
def getSex(self):
return self.__sex
# 方法的第一个参数,一定要传self
def bark(self):
print("动物叫")
class Dog(Animal):
"""继承自Animal的Dog类:额外增加寿命属性"""
def __init__(self, name, age, color="white"):
# 调用父类的初始化方法
super().__init__(name)
self.age = age
self.color = color
def __str__(self):
return "狗狗的名字是 %s ,它的年龄是 %d 岁,颜色是 %s" %(self.name, self.age, self.color)
# 重写父类的方法
def bark(self):
# 有需要的话,可以通过 `super()` 调用父类的实现
super().bark()
print("汪汪")
animal = Animal("野兽")
dog = Dog("旺财", 8, "black")
animal.bark()
dog.bark()
# 狗狗的名字是 旺财 ,它的年龄是 8 岁,颜色是 black
print(dog)
# 该动物是 野兽
print(animal)
# male
print(animal.getSex())
# 以下输出都是2
print(Animal.count)
print(Dog.count)
print(animal.count)
Dog.showInstanceNum()
单例
#! /usr/bin/python3
class MusicPlayer(object):
""" 音乐播放器单例 """
# 记录第一个创建对象的引用
instance = None
# 是否执行过初始化的标记
init_flag = False
# 一定要传入一个类cls
def __new__(cls, *args, **kvargs):
# 判断类属性是否为空对象
if cls.instance is None:
# 调用父类的方法,为第一个对象分配内存
cls.instance = super().__new__(cls)
# 返回类属性保存的对象引用
return cls.instance
def __init__(self):
# 1、判断是否执行过初始化
if MusicPlayer.init_flag:
return
# 2、没有执行过初始化,则进行初始化操作
print("这里执行初始化操作:设置实例属性等")
# 3、将初始化标记为True
MusicPlayer.init_flag = True
# 测试代码
playerOne = MusicPlayer()
playerTwo = MusicPlayer()
# 从打印中,我们可以看出:
# 内存地址一样,并且__init__的代码也执行了一次
print(playerOne, playerTwo)
扩展
list = [1, 2]
- 1、使用
dir()
获取类的方法列表数组:
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__',
'__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__',
'__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__',
'__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__',
'__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__',
'__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear',
'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
- 2、用
type()
获取对象的类型
type(list) # 输出 <class 'list'>
-
3、
__name__
是Python的一个内置属性,记录着一个字符串。如果它所在的模块被其他模块导入,则它就是模块名;如果是当前执行的程序,它就是__main__
。它可以保证:测试模块的代码只有在测试的情况下被执行,在被导入的情况下不会执行
。所以,我们经常在Python文件里看到类似于这样的代码:
# 在代码的最下方 def main(): # ... pass # 根据__main__决定是否执行以下代码 if __name__ == "__main__": main()
-
4、
__file__
用来打印模块的路径。import re print(re.__file__)
-
5、异常
异常的处理:
try: # 可能会抛出异常的代码 pass except Exception as result: # 捕获所有的异常,并给异常起个别名 # 处理捕获到的异常 pass else: # 没有异常才会执行的代码 pass finally: # 无论有没有异常,都会执行这段代码 pass
主动抛出异常:
raise Exception("主动抛出异常")
网友评论