011-python之面向对象

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

类是拥有相同功能和相同属性的对象的集合 - 抽象的概念

对象就是类的实例(类具体的表现)

2、定义类

定义类就是用代码描述这个类拥有哪些相同功能和相同属性的对象的集合

程序中描述功能:函数

程序中描述属性:变量

语法:

class 类名:
    类的说明文档
    类的内容

说明:

class - 关键字 固定写法
类名 - 程序员自己命名,采用驼峰命名法并且首字符大写(StudentName)
: - 固定写法
类的说明文档 - 多行注释
类的内容 - 相同功能和相同属性
		 由方法(对象方法,类方法,静态方法)和属性(对象属性,类属性)组成
    	 方法 - 定义在类中的函数
         属性 - 定义在类中的变量
class Person:
    "人类"
    age = 32  # num是属性

    def eat(self):  # eat是方法
        print('吃饭')

    def sleep(self):  # sleep是方法
        print('睡')
3、创建对象

语法:

对象=类名() - 创建指定类对应的一个对象,并将对象返回
class Person:
    "人类"
    age = 32  # num是属性
# 创建两个对象
p1 = Person()
p2 = Person()
print(p1, p2)
二、类中的方法
1、什么是方法

类中的方法:类中的函数 用来描述具体的功能

2、方法分类
方法类型定义调用什么时候用特点
对象方法将函数直接定义在类中在类的外面 通过对象.xxx()来调用如果实现函数的功能需要用到对象属性就使用对象方法自带参数self,通过对象调用对象方法的时候不需要传参,系统自动将当前对象传给self (self,谁调用就指向谁)
类方法在类中定义函数的时候加装饰器@classmethod通过类名.xxx()调用如果实现函数的功能不需要用对象属性需要类就使用类方法自带参数cls,调用的时候不需要传参,系统自动将当前类传给cls cls,谁调用就指向谁)
静态方法在类中定义函数的时候加装饰器@staticmethod通过类名.xxx()调用既不需要用到对象属性也不需要用到类就用静态方法没有特点
class A:
    def fun(self):
        print('对象方法')
    @classmethod
    def fun(cls):
        print('类方法')
    @staticmethod
    def fun():
        print('静态方法')
3、魔法方法

方法名以__开头并且以__结尾的自带的方法就是魔法方法

所有的魔法方法都会在特定的情况下被自动调用

3.1 常用的魔法方法
方法名作用
__init__每次创建类的对象的时候会自动调用类中的__init__方法
创建类的对象的时候 参数和参数个数由类中的__init__方法决定
__repr__打印对象的时候自动调用 对象对应的类中的__repr__方法,
该方法是定制打印规则(函数的返回值是什么,对象打印就是什么;返回值必须是返回值)
class D:
    def __repr__(self):
        return 'abc'
d = D()
print(f'd:{d}')  # d:abc

class E:
    def __init__(self):
        print('init方法')
        pass
e1=E()  # 每次创建对象的时候自动调用类中的__init__方法
class F:
    # 在类中添加__init__方法的时候除了方法名和方法类型不能改变,可以随意添加参数函数体
    def __init__(self,x,y):
        print(x+y)
f1=F(1,2)
三、属性
属性分类创建使用什么时候用
类属性在类中直接定义一个变量在外部使用 通过类.xxx的方式当属性值不会因为对象不同而不一样的时候就使用,反之就使用对象属性
对象属性self.属性名=值的形式定义在类的__init__方法中在外部使用 通过对象.属性名使用 通过对象.属性名=新值修改当属性值会因为对象不同而不一样的时候就使用
class A:
    x=100 # x是类属性
print(A.x) # 直接使用类属性 100
A.x=200    # 修改类属性的值
print(A.x) # 200


class B:
    y=200
    # name age gender 是对象属性
    def __init__(self):
        self.name='cindy'
        self.age=15
        self.gender='女'
b=B()
print(b.name,b.age,b.gender,b.y)  # cindy 15 女 200
示例 2.对象属性赋初值的方式
class Person:
    def __init__(self, name, gender = '男'):
        self.name = name        # 通过没有默认值的参数来赋值
        self.age = 1            # 赋固定值,创建对象时不能修改
        self.gender = gender    # 使用有默认值的参数来赋值,创建对象时可以修改
    def __repr__(self):
        # return f'name:{self.name},age:{self.age},gender:{self.gender}'
        return str(self.__dict__) # 把打印对象转换成字典,然后在转换成字符串
p1 = Person('小明')
print(p1)
print(p1.name, p1.age, p1.gender)

p2 = Person('小花', '女')
print(p2)
print(p2.name, p2.age, p2.gender)
练习:圆类
import math
class Circle:
    pi=math.pi
    def __init__(self,radiu):
        self.radiu=radiu
    def perimeter(self):
        p=2*Circle.pi*self.radiu
        return f'周长为:{p:.2f}'
    # 在类中实现函数的功能的时候 如果需要的数据是属性则不需要提供额外的参数
    # 类属性直接用类提供
    # 对象属性直接用self提供
    def area(self):
        a=Circle.pi*self.radiu**2
        return f'面积为:{a:.2f}'

circle1=Circle(3)
print(circle1.area())
print(circle1.perimeter())
练习:矩形类
class Rect:
    def __init__(self,length,width):
        self.length=length
        self.width=width
    def area(self):
        return self.width*self.length
    def perimeter(self):
        return (self.length+self.width)*2
    def __repr__(self):
        # return f'长度:{self.length},宽度{self.width}'
        return  f'<{str(self.__dict__)[1:-1]}>'
r1=Rect(1,4)
print(r1)
四、属性的增删改查
1、在面向对象编程的时候可以使用对象来代替字典
stu={'name':'lili','age':19,'gender':'女'}
class Student:
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender
    def __repr__(self):
        return str(self.__dict__)[1:-1]
stu1=Student('小明',17,'男')
2、对象的对象属性也支持增伤改查操作
2.1查 获取属性值
对象.属性获取指定属性的值,属性不存在报错
getattr(对象,属性名)获取指定属性的值 属性不存在报错
getattr(对象,属性名,默认值)获取指定属性的值 属性不存在返回默认值
2.2 增&改
方法
对象.属性=值属性存在修改属性值,属性不存在给对象添加属性
setattr(对象,属性名,值)属性存在修改属性值,属性不存在给对象添加属性
2.3 删除
方法
del 对象.属性删除指定属性
delattr(对象,属性名)删除指定属性
class Student:
    def __init__(self,name,age,gender):
        self.name=name
        self.age=age
        self.gender=gender
    def __repr__(self):
        return str(self.__dict__)[1:-1]
stu1=Student('小明',17,'男')
print(stu1)
delattr(stu1,'gender')
print(stu1)
2.4 hasattr
hasattr(对象,属性名,)  判断属性是否存在

注意:attr相关函数可以动态操作对象属性

五、继承
1、继承

继承就是让子类直接用拥有父类的属性和方法

父类是一个大类,子类就是大类中的一个小分类

2、语法
class 类名(父类):
    类的说明文档
    类的内容

注意:定义类的时候,没有写父类的话默认继承object(基类)

3、在继承拥有父类的同时怎么在子类中添加内容

子类在拥有父类的属性和方法的同时,往往需要有自己的一些属性和方法

  • 添加类属性和方法直接在子类中定义新的属性和新的方法
  • 添加对象属性在子类中__init__方法中写’super().init()’
示例
class Person():
    """一个人类,作为父类"""
    def __init__(self, name, age, sex):
        """父类初始化方法"""
        self.name = name
        self.age = age
        self.sex = sex

    def get_desc_info(self):
        print("姓名为:" + self.name + ",年龄为:" + str(self.age) + ",性别为:" + self.sex)
class Student(Person):
    """一个学生类,作为子类"""
    def __init__(self, name, age, sex):
        """子类初始化方法"""
        # super.__init__(name, age, sex)  # 错误示范
        super().__init__(name,age,sex)
student = Student('林梓然', 26, '男')
student.get_desc_info()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

兮知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值