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