Python面向对象讲解1(类的定义,self的使用,魔法方法)

1 类的定义

class 类名:类名一般需要遵守大驼峰命名法,每一个单词的首字母都大写;

  • class <类名>:默认是继承于object
  • class <类名>(要继承的父类):
# 小明今年18岁,身高1.75,每天早上跑完步,会去吃东西
# 小美今年17岁,身高1.65,小美不跑步,小美喜欢吃东西
class Student:  # 关注这个类有哪些特征和行为
    # 在__init__里面,以参数的形式定义特征,我们称之为属性
    def __init__(self, name, age, height):
    # 前面的是属性名,后面的是传入的参数,不一定要保持一致,建议一致
        self.name = name
        self.age = age
        self.height = height

    # 行为定义为一个个函数
    def run(self):
    # 属性需要使用self去调用
        print(f'{self.name}正在跑步')

    def eat(self):
        print(f'{self.name}正在吃东西')
# 使用student类创建了两个实例对象
# s1和s2都会有name,age,height属性,同时都run和eat方法
s1 = Student('小明', 18, 1.75)  # Student会自动调用__init__方法
s2 = Student('小美', 17, 1.65)
# 属性是直接使用实例对象调用就好了
# 下面的方法调用也是同理
print(s1.name)# 小明
print(s2.name)# 小美

# 根据业务逻辑让不同的对象执行不同的行为
s1.run()
s1.eat()
s2.eat()
"""
小明正在跑步
小明正在吃东西
小美正在吃东西
"""

2 self语句的使用

class Student(object):
    # 这个属性直接定义在类里,是一个元组,用来规定对象可以存在的属性
    # 这个可以用来限制在类外对属性的创建,很少用,作为了解
    # __slots__ = ('name', 'age', 'city')
    def __init__(self, x, y):
        self.name = x
        self.age = y

    def say_hello(self):
        print('大家好我是', self.name)


# Student('张三',18)这段代码具体做了什么?
# 1.调用__new__方法,用来申请内存空间
# 2.调用__init__方法转入参数,将self指向创建好的内存空间,填充数据

s1 = Student('张三', 18)
s1.say_hello()# 大家好我是 张三
# s2 = Student('李四', 17)
# s2.say_hello()

# 直接使用等号给一个属性赋值
# 如果这个属性以前不存在,会给对象添加一个新的属性
s = Student('小华', 18)
s.city = '北京'
print(s.city)# 北京

# 如果这个属性以前存在,会修改这个属性对应的值
s.name = '小芳'
print(s.name)# 小芳

3 魔法方法

魔法方法,也叫魔术方法,是内里的特殊的一些方法
特点:

  • 1.不需要手动调用,会在合适的时机自动调用
  • 2.这些方法,都是使用__开始,使用__结束
  • 3.方法名都是系统规定好的,在合适的时机自己调用
class Student(object):
    def __init__(self, name, age):
        print('我是__init__方法,我被调用了')
        # 在创建对象时,会自动调用这个方法
        self.name = name
        self.age = age

    def __del__(self):
        # 当对象被销毁时,会自动调用这个方法
        # 如果你创建了对象,在运行结束后控制台会打印下面的内容
        print('__del__被调用了')

    def __str__(self):
        return '姓名:{},年龄:{}'.format(self.name, self.age)

    def __repr__(self):
        return 'repr'

    def __call__(self, *args, **kwargs):
        # args中位置参数是以元组的形式保存的,kwargs中可变参数是以字典的形式保存的
        print('args={},kwargs={}'.format(args, kwargs))  # kwargs={'fn': <function <lambda> at 0x000001F5ED996D38>}
        return kwargs['fn'](args[0], args[1])


p = Student('张三', 18)
# 如果不做任何修改,直接打印一个对象,是文件的__name__,类型,内存地址
# print(p) # <__main__.Student object at 0x0000017AE3192888>

# 当打印一个对象的时候,会调用者个对象的__str__或__repr__方法
# 如果两个都重写了,选择__str__
# print(p)

# print(repr(p))# 调用内置函数repr,会触发__repr__方法
# print(p.__repr__())# 魔法方法一般不手动调用

n = p(1, 2, fn=lambda x, y: x + y)  # 对象名()==>调用这个对象的p.__call__(1,2)方法
print(n)# 3
简单小结

猜你喜欢

转载自blog.csdn.net/hmh4640219/article/details/112852359