Python周总结——类与对象

Python周总结——类与对象

类与对象

'''
对象:
	数据与功能的结合体     核心
类:
	多个对象相同数据和功能的结合体

程序中一般都是先有类,后有对象
'''

类与对象的创建

'''
类的语法结构:
	class 类名:
		"""代码注释"""
		对象公共的数据
		对象公共的方法
	1、class是定义类的关键字
	2、类名的命名与变量名几乎一致,首字符大写
	3、数据:变量名与数据值的绑定,方法就是函数

数据和功能 也可以统称为属性    数据>>>属性名       功能>>>:方法

类的定义与调用
	类在定义阶段就会执行类体代码,但是属于类的局部名称空间,外部无法直接调用
'''

小实例——简单的选课系统

# coding:utf-8
# 定义学生类
class Student:
    # 对象的公共数据
    school = '剑桥大学'

    # 对象的公共的方法
    def choice_course(self):
        print('学生选课系统')


# 查看类的名称空间
print(Student.__dict__)
# 查看类的公共数据
print(Student.__dict__.get('school'))
# 查看类的公共方法
print(Student.__dict__.get('choice_course'))

# 查看类的公共数据、方法 可以通过句点符的方式查看
print(Student.school)
print(Student.choice_course)

# 类名加()就会产生对象,每执行一次就会产生一个全新的对象
# 变量名接收类名加括号之后的返回值(结果)
obj = Student()
obj1 = Student()
obj2 = Student()
print(obj, obj1, obj2)

# 所产生的对象里面是空的
print(obj.__dict__)
print(obj1.__dict__)
print(obj2.__dict__)

# 产生的对象里面的数据是一样的
print(obj.school)
print(obj1.school)
print(obj2.school)

# 类名.变量名 = 数据值 可以更改数据值
Student.school = '伦敦大学'
print(obj.school)
print(obj1.school)
print(obj2.school)

对象独有的数据

# coding:utf-8
# class Student:
    # school = '剑桥大学'
    #
    # def choice_course(self):
    #     print('学生选课系统')


# 定义变量来接收Student类产生的对象
# obj = Student()
# obj1 = Student()
# # 推导流程1 为每个对象手动添加独有的数据
# print(obj.__dict__)  # {} 形似字典,真身是名称空间
# obj.__dict__['name'] = 'maria'
# obj.__dict__['age'] = 18
# obj.__dict__['sexy'] = 'man'
# obj.__dict__['choice'] = 'English'
# print(obj.name)
# print(obj.age)
# print(obj.sexy)
# print(obj.choice)
#
# obj1.__dict__['name'] = 'jerry'
# obj1.__dict__['age'] = 18
# obj1.__dict__['sexy'] = 'woman'
# obj1.__dict__['choice'] = 'Chinese'
#
# print(obj1.name)
# print(obj1.age)
# print(obj1.sexy)
# print(obj1.choice)

# 推到流程2 将添加对象的独有数据的代码封装成函数
# def init(obj, name, age, sexy, choice):
#     obj.__dict__['name'] = name
#     obj.__dict__['age'] = age
#     obj.__dict__['sexy'] = sexy
#     obj.__dict__['choice'] = choice
#
#
# stu = Student()
# stu1 = Student()
# init(stu, 'maria', 18, 'man', 'English')
# init(stu1, 'jerry', 18, 'woman', 'Chinese')
# print(stu.__dict__)
# print(stu1.__dict__)

# 推到流程3 学生对象添加独有数据的函数只有学生对象有资格调用
# class Student:
#     school = '剑桥大学'
#
#     def init(obj, name, age, sexy, choice):
#         obj.__dict__['name'] = name
#         obj.__dict__['age'] = age
#         obj.__dict__['sexy'] = sexy
#         obj.__dict__['choice'] = choice
#
#     def choice_course(self):
#         print('学生选课系统')


# stu = Student()
# Student.init(stu, 'maria', 18, 'man', 'English')
# stu1 = Student()
# Student.init(stu1, 'jerry', 18, 'woman', 'Chinese')
# print(stu.__dict__)
# print(stu1.__dict__)

# 推到过程4 init方法变形
# class Student:
#     school = '剑桥大学'
#
#     def __init__(obj, name, age, sexy, choice):
#         obj.__dict__['name'] = name
#         obj.__dict__['age'] = age
#         obj.__dict__['sexy'] = sexy
#         obj.__dict__['choice'] = choice
#
#
#     def choice_course(self):
#         print('学生选课系统')
#
#
# stu = Student('maria', 18, 'man', 'English')
# print(stu.__dict__)
# print(stu.name)
# print(stu.school)


# 推导步骤5 变量名修改
class Student:
    school = '剑桥大学'

    def __init__(self, name, age, sexy, choice):
        self.name = name
        self.age = age
        self.sexy = sexy
        self.choice = choice


    def choice_course(self):
        print('学生选课系统')


stu = Student('jerry', 18, 'woman', 'Chinese')
print(stu.choice)

对象独有的功能

# coding:utf-8
# class Student:
#     school = '剑桥大学'
#
#     def __init__(self, name, age, sexy, choice):
#         self.name = name
#         self.age = age
#         self.sexy = sexy
#         self.choice = choice
#
#
#     def choice_course(self):
#         print(f'学生{self.name}正在使用选课系统')


# 直接定义在全局的功能函数,该函数就不是Student对象独有的函数
# def input_choice():
#     print('Student choice!')
#
#
# stu = Student('maria', 18, 'man', 'English')
# stu.input_choice = input_choice
# print(stu.__dict__)
# stu.input_choice()

# 只要将函数定义在类中,默认就是绑定给对象使用
class Student:
    school = '剑桥大学'

    def __init__(self, name, age, sexy, choice):
        self.name = name
        self.age = age
        self.sexy = sexy
        self.choice = choice

    def input_choice(self):
        print('Student choice!')
        return Student

    def choice_course(self):
        print(f'学生{self.name}正在使用选课系统')


# 类调用需要传入参数
# Student.input_choice(1)

# 对象调用会自动将对象作为第一个参数传入
stu = Student('maria', 18, 'man', 'English')
print(stu.input_choice())  # 结果里面会有一个返回值,不定义return则为None

'''
对象修改数据值
'''

# 当点的名字不存在的时候,则新增数据(形式类似键值对)
stu.hobby = 'dance'
# __dict__方法可以查看Student内的数据
print(stu.__dict__)

动静态方法

'''
动态方法:
	1.绑定给对象的方法
	2.绑定给类的方法
静态方法:
	无论是类还是对象调用,都需要自己动手传参
'''
# coding:utf-8
class Student:
    school = '蓝翔技校'

    # 直接定义的函数,默认绑定给对象,类调用,有几个参数用传个
    # 对象调用,第一个参数就是对象自身
    def func(self):
        print('绑定给对象')

    # 被@classmethod修饰的函数,默认绑定给类
    # 类调用第一个参数就是类自身
    # 对象也可以调用,并且回自动将产生该对象的类作为第一个参数传入
    @classmethod
    def func1(cls):
        print('绑定给类')

    # 被@staticmethod修饰的函数,是静态方法
    # 无论是类还是对象,调用都要自己手动传参
    @staticmethod
    def func2(num):
        print('自己传参,丰衣足食')


obj = Student()
obj.func()
Student.func(1)
obj.func1()
Student.func1()
obj.func2(123)
Student.func2(123)

继承的概念

'''
面向对象的三大特性:
	封装、继承、多态
1、继承的含义
	表示类与类之间资源的从属关系
2、继承的目的
	classA继承classB,那么A就拥有了B所有的数据和方法的使用权限,A是B的子类,B是A的父类
3、继承的使用
	class C1:
		pass
	class c2(c1):
		pass
4、继承的本质
	对象:数据与功能的结合体
	类(子类):多个对象相同数据和功能的结合体
	父类:多个类(子类)相同数据和功能的结合体
	1、抽象:将多个类相同的东西抽出去形成一个新的类
	2、继承:将多个类继承刚刚抽出来的新的类
'''
class C1:


    def func(self):
        print('I\'m your father')


class C2:
    school = '剑桥大学'

class C3(C1, C2):
    pass


obj = C3()
obj.func()
print(obj.school)

名字的查找顺序

'''
1、不继承情况下的名字查找顺序
	对象自身 >>> 产生对象的类
2、单继承情况下的名字查找顺序
	对象自身 >>> 产生对象的类 >>> 父类
3、多继承情况下的名字查找顺序
	对象自身 >>> 产生对象的类 >>> 父类(从左往右)
'''
# 没有继承的情况下
class C1:
    hobby = 'dance'

obj = C1()
print(obj.hobby)    # dance
obj.hobby = 'sing song'
print(obj.hobby)    # sing song

# 单继承的情况下:
class C2(C1):
    pass

obj1 = C2()
print(C2.hobby)     # dance
obj1.hobby = 'sing song'
print(obj1.hobby)   # sing song

# 多继承的情况下
class C3(C2,C1):
    pass

obj2 = C3()
print(C3.hobby)   # dance  C1
print(obj2.hobby)  # dance C1

经典类与新式类

'''
经典类:不继承object或者其子类的类
新式类:继承object或者其子类的类
    在python2中有经典类和新式类
    在python3中只有新式类(所有类默认都继承object)
'''
class Srudent(object):pass
ps:以后我们在定义类的时候,如果没有其他明确的父类.要习惯写object兼容

派生方法

'''
派生方法:
	所谓派生方法就是子类基于父类的某个方法做了拓展
'''
class Person:
    def __init__(self, name, age, sexy):
        self.name = name
        self.age = age
        self.sexy = sexy


class Student(Person):
    def __init__(self, name, age, sexy, sid):
        # super().__init__ 是子类调用父类的方法
        super().__init__(name, age, sexy)
        self.sid = sid


class Teacher(Person):
    def __init__(self, name, age, sexy, tid):
        super().__init__(name, age, sexy)
        self.tid = tid


obj = Student('maria', 18, 'woman', '202201008')
obj1 = Teacher('jason', 42, 'man', '19800000')
print(obj.__dict__)
print(obj1.__dict__)
posted @ 2022-11-06 18:09  负剑远游行归来仍少年  阅读(70)  评论(0)    收藏  举报