学习python的第14天

本文详细介绍了Python的面向对象编程,包括类中的方法(对象方法、类方法、静态方法)、构造函数与`__init__`方法、类属性与对象属性的定义及分类,以及对象属性的增删改查操作。通过学习,读者可以深入理解Python的OOP概念和实践。
摘要由CSDN通过智能技术生成

面向对象编程

一、类中的方法

定义类就是描述清楚这个类是拥有哪些相同的功能和属性的集合。
类中的方法就是对类相同的功能的描述。

1.三种方法
  • 对象方法
    怎么定义:直接定义在类中农的函数
    特点:自带参数self(如果使用对象去调用对象方法,对象方法中self不要传参。系统会自动将当前对象传给self)
    怎么调用:对象.方法()
  • 类方法
    怎么定义:在定义函数前加@classmethod
    特点:自带函数cls(如果使用类去调用类方法,方法中的cls不用传参,系统会自动将当前类传给cls)cls指向当前类
    怎么调用:类.方法()
  • 静态方法
    怎么定义:在定义函数前加@staticmethod
    特点:没有默认参数
    怎么调用:类.方法()
class Person:
    # ==============对象方法==============
    # eat就是对象方法
    def eat(self, food='米饭'):
        # self: 谁调用就指向谁
        print(f'self:{self}')
        print('人类吃', food)

    # sleep是对象方法
    def sleep(self):
        print('睡觉')

    # ==============类方法==============
    @classmethod
    def show_num(cls, num=61):
        print(f'cls:{cls}')
        print(f'人类的数量: {num}亿')

    # ==============静态方法==============
    @staticmethod
    def show_message():
        print('人类破坏环境!')


p1 = Person()
p2 = Person()
print(f'p1:{p1}')
# p1:<__main__.Person object at 0x000002A28991E548>
print(f'p2:{p2}')
# p2:<__main__.Person object at 0x000002A28991E588>

p2.eat()
# 人类吃 米饭
p1.sleep()
# 睡觉
p1.eat('面条')
# self:<__main__.Person object at 0x000002A28991E548>
# 人类吃 面条

Person.show_num()
# cls:<class '__main__.Person'>
# 人类的数量: 61亿
Person.show_num(60)
# cls:<class '__main__.Person'>
# 人类的数量: 60亿

Person.show_message()
# 人类破坏环境!

注意:从语法角度来看,不管是对象方法、类方法还是静态方法都可以使用类和对象调用(但实际开发不要这样做)

二、构造函数和init

1.什么是构造函数

函数名和类同名的用来创建的对象的函数/方法。
python中,当我们在定义类的似乎,系统会自动创建这个类的构造函数。在这个构造方法中会自动调用__new__方法来创建对象,并且用这个创建好的对象来调用__init__对对象进行初始化操作,最后才将对象返回。

2.__init__方法

init__是每个类中都有一个特殊的对象方法,是魔法方法(会被自动调用);当创建类的对象的时候这个类中的__init__方法会被自动调用。
在类中添加__init__方法,只需要保证方法名是__init
,方法是对象方法。

class Dog:
    def __init__(self, x):
        print('init方法')
        print(x)

"""
def Dog():
    dog = Dog.__new__()
    dog.__init__()
    return dog
"""

当调用构造方法创建对象的时候,系统自动调用这个类中__init__方法。
调用构造方法创建对象的时候,这个构造方法需不需要参数,需要几个参数,看类中的__init__方法除了self以外需不需要参数需要几个参数。

三、类中的属性

1.什么是属性

我们通过类中的属性来保存类相关的属性。

2.属性的分类
  • 类属性(类的字段)
    定义:直接定义在类中的变量就是类属性
    使用:类.属性
    什么时候用:属性值不必因为对象不同而不一样的时候,就使用类属性

  • 对象属性
    定义:在__init__方法中,以self.属性=值 的形式进行定义(属性自己命名,要求和规范和变量名一样)
    使用:对象.属性
    什么时候用:属性值会因为对象不同而不一样的时候,就使用对象属性

a = 100


class Student:
    # num就是类属性
    num = 30

    def __init__(self):
        # name和age, score就是对象属性
        self.name = '张三'
        self.age = 18
        self.score = 0


print(a)  # 100
print(Student.num)   # 30

stu = Student()
print(stu.name, stu.age, stu.score)   # 张三 18 0

stu2 = Student()
print(stu.name, stu.age, stu.score)   # 张三 18 0
print(stu2)  <__main__.Student object at 0x000001B9521DE948>


class Circle:
    pi = 3.1415926


class Person:
    def __init__(self, name, gender='男'):
        self.name = name
        self.age = 0
        self.gender = gender

    # 重写__repr__方法可以自定义对象的打印格式;这个方法的返回值就是对象的打印结果(返回值必须是字符串)
    def __repr__(self):
        # 打印谁,self就是谁
        return f'name:{self.name} age:{self.age} gender:{self.gender}'


p1 = Person('小明')
print(p1)  # name:小明 age:0 gender:男

p2 = Person('小花', '女')
print(p2)   # name:小花 age:0 gender:女

四、对象属性的增删改查

python类对象的属性是支持增、删、改、查

class Dog:
    def __init__(self, name, breed='土狗', sex='母狗', age=1):
        self.breed = breed
        self.sex = sex
        self.age = age
        self.name = name


dog1 = Dog('大黄', sex='公狗')
dog2 = Dog('宝贝', '哈士奇', age=3)
1.查 - 获取属性值
  • 对象.属性 - 获取对象指定属性的值
  • getattr(对象, 属性名) - 获取对象指定属性的值
  • getattr(对象, 属性名, 默认值) - 获取对象指定属性的值(如果属性不存在不会报错,返回默认值)
print(dog1.name)
print(getattr(dog1, 'name'))
print(getattr(dog1, 'name', '无名'))

# print(dog1.color)   # AttributeError: 'Dog' object has no attribute 'color'
# print(getattr(dog1, 'color'))   # AttributeError: 'Dog' object has no attribute 'color'
print(getattr(dog1, 'color', '白色'))   # 白色

getattr可以根据变量的值动态获取指定属性的值

print(dog1.age)
value = input('属性名:')
print(getattr(dog1, value))
2.增、改
  • 对象.属性 = 值 - 如果属性存在就是修改对象属性的值;如果属性本身不存在就是添加属性
  • setattr(对象, 属性名, 值) - 如果属性存在就是修改对象属性的值;如果属性本身不存在就是添加属性
dog1.name = '小黄'
print(dog1.name)  # 小黄

dog1.color = '黄色'
print(dog1.color)    # 黄色

setattr(dog1, 'name', '黄黄')
print(dog1.name)   # 黄黄

setattr(dog1, 'weight', 10)
print(dog1.weight)   # 10
3.删
  • del 对象.属性 - 删除对象的指定属性
  • delattr(对象, 属性名) - 删除对象的指定属性
del dog1.age
# print(dog1.age)   # AttributeError: 'Dog' object has no attribute 'age'

delattr(dog1, 'name')
# print(dog1.name)     # AttributeError: 'Dog' object has no attribute 'name'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值