Day15 类和对象

Day15 类和对象

一、编程思维

  • 根据面对问题不同人呈现出来的思维模式不同,可以将编程思维分为三种
    • 1、面向过程编程 - 遇到问题马上想到解决问题的具体的逻辑和步骤
    • 2、函数式编程 - 是否已经有存在对函数解决,没有就创建一个函数
    • 3、面向对象编程 - 是否已经有具有这个功能的对象,如果没有就造一个

二、类和对象

1、什么是类,什么是对象

  • 类就是相同功能或者相同属性的对象的集合
  • 对象就是类的实例

2、定义类(创建类)

1)、定义类:

  • 是用代码来描述这个类拥有哪些相同功能(用函数)和相同属性(用变量)的集合

2)、语法:

calss 类名(父类):
类的说明文档
类的内容(包含方法和属性)

3)、说明

  • a) class - 关键字:固定写法

  • b) 类名 - 自己命名,

    ​ 两个要求:是标识符不是关键字
    ​ 规范:见名知义;不使用系统的函数名、类名和模块名;采用驼峰式命名(大驼峰)

  • c) 类的说明文档 - 本质是一个多行注释

  • d) 类的内容 - 包含定义在类中的函数(方法)和定义在类中的变量
    方法包括: 对象方法、类方法、静态方法
    属性百科: 类属性、对象属性

3、创建对象

  • 对象是通过类来创造的。
  • 类型转换也是创建对象
  • 语法:
    对象名 = 类名()

三、方法

1、什么是方法

1)对象方法

  • a.怎么定义: 直接定义的函数就是对象方法
  • b.怎么调用: 以 '对象.xxx()’ 的方式来调用
  • c.特点: 自带参数self,调用函数的时候self不需要传参,系统自动将当前对象传给self
    需要其他参数手动在self后面加
class A:
    # func1就是对象方法
    def func1(self):
        # self=a
        print(f'{self}')
        print('这是对象方法')
a = A()
# 通过对象来调用对象方法
a.func1()

2)类方法

  • a.怎么定义: 定义函数前添加装饰器 @classmethod
  • b.怎么调用: 以 ‘类名.xx()’ 形式调用
  • c.特点: 自带参数cls,调用函数的时候cls不需要传参,系统自动将当前类传给cls
class A:
    # func3是类方法
    @classmethod
    def func3(cls):
        print('这是类方法')
        print(cls)
# 通过类名来调用类方法
A.func3()  # <class '__main__.A'>
print(A)  # <class '__main__.A'>

3)静态方法:

  • a.怎么定义: 定义函数前添加装饰器 @staticmethod
  • b.怎么调用: 以 ‘对象名.xx()’ 形式调用
  • c.特点: 没有特点,实现的功能既不涉及类又不涉及对象的方法
class A:
    @staticmethod
    def func4():
        print('fun4是静态方法')

四、魔法方法

1、魔法方法的特点:

  • a.函数名以__ 开头,以__结尾
  • b.不需要程序员自己调用,系统会在特定的情况下自动调用

2、两个常见的魔法方法

  • a. __intit:
    • 如果类中添加了intit;在创建当前类的对象的时候自动调用
    • 创建对象的时候需不需要实参,需要几个实参,有类中的init决定
class A:
    def __init__(self):
        print(f'__init__被调用')


a = A()
  • b. repr
    • 当打印类的对象的时候,如果类中添加了repr方法,打印类的对象的时候会自动调用这个方法,并且将这个方法对应的方法返回作为打印结果进行打印
    • 在类中添加____repr__方法的时候,这个方法返回值必须是字符串,否则报错
class B:
    def __repr__(self):
        return 'class B'

b = B(10, 20)  # a:10,b:20
b2 = B(b=10, a=-2)  # a:-2,b:10
print(b)  # class B

六、属性

1、类属性

1)怎么定义:

  • 直接在类中定义的变量就是类属性

2)怎么使用:

  • 以 ‘类名.属性名’ 的方式使用

3)什么时候使用:

  • 如果属性的值不会因为对象不同而不一样,就设置类属性

2、对象属性

1)怎么定义:

  • 以 ‘self.xxx=xxx ’的形式定义在____init__方法中

2)怎么使用:

  • ​ 以 ‘对象.属性名’ 的方式使用

3)什么时候使用:

  • 如果属性的值会因为对象不同而不一样,就设置对象属性

4)对象属性赋值:

  • a.直接赋值(不适用)
  • b.传参赋值:在self后面给出参数;可以设置默认值
class A:
    # a,name都是类属性
    a = 10
    name = 'xiaoming'

    # age,scores、sex都是类属性
    def __init__(self):
        self.age = 10
        self.scores = 100
        self.sex = '女'


# 通过类使用类属性
print(A.name)

# 通过对象使用对象属性
a = A()
print(a.age)  # 10
print(a.sex)  # 女
print(a.name)  # xiaoming


class Circle:
    pi = 3.1415926

    def __init__(self,r):
        self.r =r
    # 如果对象方法中遇到对象属性用self提供
    def aera(self):
        return Circle.pi*self.r**2

c1=Circle(1)
print(c1.aera())  # 3.1415926


class Dog:
    def __init__(self, name, age=2, gender='公'):
        self.name = name
        self.age = age
        self.gender = gender


dog1 = Dog('caicai')
print(dog1.name,dog1.age,dog1.gender)  # caicai 2 公

七、继承

1、继承:

让子类继承父类的属性和方法

  • 子类 - 继承者
  • 父类 - 被继承的类

2、继承语法

  • class 类名(父类1,父类2,…)
    类的说明文档
    类的内容

  • 注意:如果定义类的时候没有写父类,类默认继承object类(鸡肋)

class A:
    m=10

    def __init__(self):
        self.n=12

    def func1(self):
        print('A对象类')

    @classmethod
    def func2(cls):
        print('A类方法')

    @staticmethod
    def func3():
        print('A静态方法')
class B(A):
    # 添加新的类属性
    x=11

    def __init__(self):
        super().__init__()   # 调用父类的__init__  否则无法使用父类里面的对象属性
        # super(B, self).__init__()
        self.m=100

    # 添加新的方法
    def func11(self):
        print('B的对象方法')

    @classmethod
    def func22(cls):
        print('B类方法')

    @staticmethod
    def func33():
        print('B静态方法')
b=B()
# 使用A类里面的方法和属性
print(b.n)  # 12
print(b.func1())
print(b.func2())
print(b.func3())

# 使用B类里面的方法和属性
print(b.func11())
print(b.func22())
print(b.func33())
print(b.m)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值