8-python基础学习-面向对象-类class的创建,定义,封装、继承、多态的实现

修订日期 内容
2021-2-12 初稿

一、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.
'''

おすすめ

転載: blog.csdn.net/weixin_48470176/article/details/113797482