修订日期 | 内容 |
---|---|
2021-2-12 | 初稿 |
8-python基础学习-面向对象-类class的创建,定义,封装、继承、多态的实现
一、class
类的定义
class 中的内容包括
- 类属性
- 实列方法
- 静态方法
- 类方法
代码示例
class Person:
# 类属性
gender_male = '男'
# 实例方法
def paly(self):
print('过年开心玩耍啦')
@staticmethod # 静态方法,使用注解@staticmethod
def study():
print("好好学习")
@classmethod # 类方法,使用注解@classmethod
def clsclsm(cls):
print('类方法,', cls)
print(id(Person), Person, type(Person)) # 2550935849680 <class '__main__.Person'> <class 'type'>
# 定义在class类外面的方法称之为函数
def fun()
pass
二、实例对象的创建与属性调用
创建一个类实列,类似java中的Object obj = new Object()
代码示例
使用上面的class person
为例,创建对象
p = Person()
print(id(p), p, type(p)) # 3158991178096 <__main__.Person object at 0x000002DF828C0970> <class '__main__.Person'>
# 调用类属性
# 使用类与实列对象均可以访问类属性,建议采用第一种方式
print(Person.gender_male, p.gender_male) # 男 男
#调用实列方法,两种调用方式均可
print(p.paly(), Person.paly(p))
# 调用静态方法 推荐前者
print(Person.study(),p.study())
# 调用类方法 推荐前者
print(Person.clsclsm(),p.clsclsm())
三、面向对象三大特征
封装
简述
python语言中没有类似java中的private、protect等修饰符修饰访问属性,可以使用双下划线 ‘_ _’控制
代码例子
class Language:
def __init__(self, key, name):
# 定义的key不想被外部直接访问可以使用self.__key = key
self.set_key(key)
# 或使用 self.__key = key
# self.__key = key
self.name = name
# 定义key的类似java的get/set方法
def get_key(self):
# 注意 双下划线
return self.__key
# 定义set方法,供外部修改
def set_key(self, key):
# 注意 双下划线
self.__key = key
l = Language('p', 'Python')
# print(l.key) # 报错 AttributeError: 'Language' object has no attribute 'key'
# key 只能使用get方法访问
print(l.get_key()) # p
# name 可以直接访问
print(l.name) # Python
封装后的直接访问方式(强制/暴力访问)
上述例子中的key属性还有其他的访问方式吗?看下面
# 列出所有可以使用的方法
print(dir(l)) # ['_Language__key', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', 'get_key', 'name', 'set_key']
print(l._Language__key) # p
继承
简述
Python中也有 类似java中的超类`Object`,不同之处在于java中不支持的多继承在Python中可以支持
代码例子
# 定义一个父类
class Language:
def __init__(self, key, name):
self.key = key
self.name = name
def info(self):
print('Language info:key={0},name={1}'.format(self.key, self.name))
# 定义子类
class Java(Language):
def __init__(self, key, name, top):
# 一定要主动调用父类中的__init?
super().__init__(key, name)
self.top = top
java = Java('j', 'Java', 'No1')
java.info() # Language info:key=j,name=Java
print(java.top) # No1
多继承语法
class B(Java,Language):
pass
子类重写父类方法
# 定义一个父类
class Language:
def __init__(self, key, name):
self.key = key
self.name = name
def info(self):
print('Language info:key={0},name={1}'.format(self.key, self.name))
# 定义子类
class Java(Language):
def __init__(self, key, name, top):
# 一定要主动调用父类中的__init?
super().__init__(key, name)
self.top = top
def info(self):
super().info()
print('Java top:{0}'.format(self.top))
java = Java('j', 'Java', 'No1')
java.info() # info:key=j,name=Java
'''
Language info:key=j,name=Java
Java top:No1
'''
多态
接上述【子类重写父类方法】
为例
多态实现代码例子
# 再次定义一个Python的子类
class Python(Language):
def __init__(self,key,name,top):
super(Python, self).__init__(key,name)
self.top = top
def info(self):
super(Python, self).info()
print('Python top:{}'.format(self.top))
# 定义一个函数
def fun(language):
language.info()
print('=================')
fun(java)
fun(Python('p', 'Python', 'No1 in future.')) # 哈哈,不久后python 将要top 1了
'''
=================
Language info:key=j,name=Java
Java top:No1
Language info:key=p,name=Python
Python top:No1 in future.
'''