python基础代码系列:类与对象

         在哔哩哔哩上学习python时,根据视频老师的讲解与自己学习的进度,记录了学习时的代码,当对于类与对象这部分有什么不清楚的理解理解就可以直接使用喔~^_^~~~
 

目录

1.创建类

2.创建类对象

3. 实例对象

4.  封装

5. 继承 与 多继承

6. 继承之方法重写

7. object类

8. 多类

9. 特殊属性

10. 特殊方法

11. 类的赋值 


1.创建类

  • demo1: 基本认识
class Student:   # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
    pass


# Python 中一切皆对象  Student是对象吗?内存有空间吗?
print(id(Student))
print(type(Student))
print(Student)
  • demo2:类的详细介绍(实例) 
class Student:   # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
    native_place = '河南'  # 直接写在类里的变量,成为类属性

    def __init__(self, name, age):  # 初始化方法
        self.name = name  # self.name 称为实体属性, 进行了一个赋值的操作,将局部变量的name的值赋给实体属性
        self.age = age

    # 实例方法
    def eat(self):
        print('学生在吃饭...')

    # 静态方法
    @staticmethod
    def method():
        print('我使用了staticmethod进行修饰,所以我是静态方法')

    # 类方法
    @classmethod
    def cm(cls):
        print('我是类方法,因为我使用了classmethod进行修饰')


# 在类之外定义的称为函数,在类之内的称为方法
def drink():
    print('喝水')

2.创建类对象

demo3:在demo2的基础上创建类对象

class Student:   # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
    native_place = '河南'  # 直接写在类里的变量,成为类属性

    def __init__(self, name, age):  # 初始化方法
        self.name = name  # self.name 称为实体属性, 进行了一个赋值的操作,将局部变量的name的值赋给实体属性
        self.age = age

    # 实例方法
    def eat(self):
        print('学生在吃饭...')

    # 静态方法
    @staticmethod
    def method():
        print('我使用了staticmethod进行修饰,所以我是静态方法')

    # 类方法
    @classmethod
    def cm(cls):
        print('我是类方法,因为我使用了classmethod进行修饰')


# 在类之外定义的称为函数,在类之内的称为方法
def drink():
    print('喝水')


# 创建Student类的对象
stu1 = Student('张三', 20)   # stu1 称为实例对象
print(id(stu1))
print(type(stu1))
print(stu1)
print('-----------------------')
print(id(Student))
print(type(Student))
print(Student)

demo4:创建类对象

class Student:   # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
    native_place = '河南'  # 直接写在类里的变量,成为类属性

    def __init__(self, name, age):  # 初始化方法
        self.name = name  # self.name 称为实体属性, 进行了一个赋值的操作,将局部变量的name的值赋给实体属性
        self.age = age

    # 实例方法
    def eat(self):
        print('学生在吃饭...')

    # 静态方法
    @staticmethod
    def method():
        print('我使用了staticmethod进行修饰,所以我是静态方法')

    # 类方法
    @classmethod
    def cm(cls):
        print('我是类方法,因为我使用了classmethod进行修饰')


# 在类之外定义的称为函数,在类之内的称为方法
def drink():
    print('喝水')


# 创建Student类的对象
stu1 = Student('张三', 20)   # stu1 称为实例对象
stu1.eat()  # 对象名.方法名
print(stu1.name)
print(stu1.age)

print('-----------------')
'''
 # 35行与30行代码功能相同,都是调用Student中的eat方法
 # 类名.方法名(类的对象)--> 实际上就是方法定义处的self
'''
Student.eat(stu1)

  • demo5:创建类对象(类方法与静态方法)
class Student:   # Student 为类的名称(类名)由一个或多个单词组成,每个单词的首字母大写,其余小写
    native_place = '吉林'  # 直接写在类里的变量,成为类属性

    def __init__(self, name, age):  # 初始化方法
        self.name = name  # self.name 称为实体属性, 进行了一个赋值的操作,将局部变量的name的值赋给实体属性
        self.age = age

    # 实例方法
    def eat(self):
        print('学生在吃饭...')

    # 静态方法
    @staticmethod
    def method():
        print('我使用了staticmethod进行修饰,所以我是静态方法')

    # 类方法
    @classmethod
    def cm(cls):
        print('我是类方法,因为我使用了classmethod进行修饰')


# 在类之外定义的称为函数,在类之内的称为方法
def drink():
    print('喝水')


# 类属性的使用方式
print(Student.native_place)
stu1 = Student('张三', 20)
stu2 = Student('李四', 30)
print(stu1.native_place)
print(stu2.native_place)
Student.native_place = '天津'
print(stu1.native_place)
print(stu2.native_place)

# 类方法的使用方式
print('------------类方法的使用方式--------------')
Student.cm()
print('------------静态方法的使用方式--------------')
Student.method()

3. 实例对象

  • demo6:实例对象
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def eat(self):
        print(self.name + '在吃饭')


stu1 = Student('张三', 20)
stu2 = Student('李四', 30)
print(id(stu1))
print(id(stu2))
print('---------为stu1动态绑定性别属性---------')
stu1.gender = '女'
print(stu1.name, stu1.age, stu1.gender)
# print(stu2.name, stu2.age, stu2.gender) # 报错 没有为stu2绑定gender属性
print(stu2.name, stu2.age)
print('--------------')
stu1.eat()
stu2.eat()

def show():
    print('定义在类之外的,称函数')

stu1.show = show
stu1.show()  # 为stu1动态绑定方法
# stu2.show()  # 报错  因为stu2没有绑定show方法


4.  封装

  • demo7:封装
class Car:  # Car就是类对象
    def __init__(self, brand):
        self.brand = brand

    def start(self):
        print("汽车已启动...")

'''
__init__() start() 这两个在类中,就是被类包装起来了
'''

car = Car('宝马X5')
car.start()
print(car.brand)
  • demo8:封装

class Student:
    # 封装
    def __init__(self, name, age):
        self.name = name
        self.__age = age  # 年龄不希望在类的外部被使用,所以加了两个_

    def show(self):
        print(self.name, self.__age)


stu = Student('张三', 20)
stu.show()
# 在类的外部使用name 和 age
print(stu.name)
# print(stu.__age)  # 不能使用?为什么?应该怎么使用__age呢?
print(dir(stu))
print(stu._Student__age)  # 在类的外部可以通过 _Student__age 进行访问

'''
那封装还有什么意义吗?
靠程序员的自觉性,看到前面有两个_的属性,就尽量不要访问了,因为该属性不希望在类的外部被使用,
但是也可以使用,比如上面利用_Student__age来访问__age,但不建议这样做
'''

5. 继承 与 多继承

  • demo9:继承
class Person(object):  # Person继承object类
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)


class Student(Person):   # Student 继承Person类
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)
        self.stu_no = stu_no


class Teacher(Person):   # Teacher 继承Person类
    def __init__(self, name, age, teachofyear):
        super().__init__(name, age)
        self.teachofyear = teachofyear


stu = Student('张三', 20, '1001')
teacher = Teacher('李四', 34, 10)

stu.info()
teacher.info()
  • demo10:多继承
class A(object):    # A继承object类
    pass


class B(object):  # B继承object类
    pass


class C(A, B):   # C类继承A同时继承B
    pass

6. 继承之方法重写

  • demo11:继承之方法重写
class Person(object):  # Person继承object类
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def info(self):
        print(self.name, self.age)


class Student(Person):   # Student 继承Person类
    def __init__(self, name, age, stu_no):
        super().__init__(name, age)
        self.stu_no = stu_no

    def info(self):
        super().info()
        print('学号', self.stu_no)


class Teacher(Person):   # Teacher 继承Person类
    def __init__(self, name, age, teachofyear):
        super().__init__(name, age)
        self.teachofyear = teachofyear

    def info(self):
        super().info()
        print('教龄', self.teachofyear)


stu = Student('张三', 20, '1001')
teacher = Teacher('李四', 34, 10)

stu.info()
print('----------------')
teacher.info()

7. object类

  • demo12:object类
class Student:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def __str__(self):
        return '我的名字是{0},今年{1}岁了'.format(self.name, self.age)
stu = Student('张三', 20)
print(dir(stu))   # dir()查看属性和方法
print(stu)  # 重写__str__()后,print默认会调用__str__()这样的方法
print(type(stu))

8. 多类

  • demo13: 多类
class Animal(object):
    def eat(self):
        print('动物会吃')


class Dog(Animal):
    def eat(self):
        print('狗吃骨头')


class Cat(Animal):
    def eat(self):
        print('猫吃鱼')


class Person(object):
    def eat(self):
        print('人吃五谷杂粮')


# 定义一个函数
def fun(obj):
    obj.eat()


# 开始调用函数
fun(Cat())
fun(Dog())
fun(Animal())
print('-----------------')
fun(Person())

9. 特殊属性

  • demo14: 特殊属性
# print(dir(object))


class A:
    pass


class B:
    pass


class C(A, B):
    def __init__(self, name, age):
        self.name = name
        self.age = age


class D(A):
    pass

# 创建C类的对象
x = C('Jack', 20)  # x是C类型的一个实例对象
'''
__dict__ 获得类对象或者实例对象所绑定的所有属性和方法的字典
'''
print(x.__dict__)  # 实例对象的属性字典
print(C.__dict__)
print('-----------------')
print(x.__class__)  # <class '__main__.C'> 输出了对象所属的类
print(C.__bases__)  # C类的父类类型的元素
print(C.__base__)  # 类的基类,离谁进输出谁 class C(A, B)输出A类,class C(B, A)输出B类
print(C.__mro__)  # 类的层次结构
print(A.__subclasses__())  # 子类的列表

10. 特殊方法

  • demo15:特殊方法
a = 20
b = 100
c = a + b  # 两个整数类型的对象的相加操作
# 为什么能执行加法呢?  它的底层执行了什么?
d = a.__add__(b)

print(c)
print(d)


class Student:
    def __init__(self, name):
        self.name = name

    def __add__(self, other):  # 不编写这个方法,会报错
        return self.name + other.name

    def __len__(self):
        return len(self.name)


stu1 = Student('张三')
stu2 = Student('李四')

s = stu1 + stu2  # 实现了两个对象的加法运算(因为在Student类中, 编写__add__()特殊的方法)
print(s)
s = stu1.__add__(stu2)
print(s)
print('-----------------')
lst = [11, 22, 33, 44]
print(len(lst))  # len是内置函数len
print(lst.__len__())
# print(len(stu1))  # 报错  'Student' has no len() ,若非要输出,要在类中编写__len__()函数
print(len(stu1))  # 编写一个__len__()函数后
  • demo16:特殊方法2
"""
    __new__()用于创建对象
    __init__()对创建的对象进行初始化
    new在前先创建对象
    init在之后对实例对象进行赋值
"""


class Person(object):
    def __new__(cls, *args, **kwargs):
        print('__new__被调用执行了,cls的id值为{0}'.format(id(cls)))
        obj = super().__new__(cls)
        print('创建的对象的id为:{0}'.format(id(obj)))
        return obj

    def __init__(self, name, age):
        print('__init__被调用执行了,self的id值为{0}'.format(id(self)))
        self.name = name
        self.age = age


print('object这个类对象的id为{0}'.format(id(object)))
print('Person这个类对象的id为{0}'.format(id(Person)))

# 创建Person类的实例对象
p1 = Person('张三', 20)
print('p1这个Person类的实例对象的id为{0}'.format(id(p1)))

11. 类的赋值 

  •  demo17: 类的赋值 
class CPU:
    pass


class Disk:
    pass


class Computer:
    def __init__(self, cpu, disk):
        self.cpu = cpu
        self.disk = disk


# (1)变量的赋值
cpu1 = CPU()
cpu2 = cpu1
print(cpu1, id(cpu1))  # cpu1和cpu2的内存地址一样,说明实际上是一个对象放到了两个变量当中去存储
print(cpu2, id(cpu2))

# (2)类的浅拷贝
print('---------------------------------------')
disk = Disk()  # 创建一个硬盘类的对象
computer = Computer(cpu1, disk)  # 创建一个计算机类的对象

# 浅拷贝
import copy
print(disk)
computer2 = copy.copy(computer)
print(computer, computer.cpu, computer.disk)
print(computer2, computer2.cpu, computer2.disk)
print('--------------------------------------------')
# 深拷贝
computer3 = copy.deepcopy(computer)
print(computer, computer.cpu, computer.disk)
print(computer3, computer3.cpu, computer3.disk)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值