Python面向对象
- 面向对象基本语法
# 小明今年18岁,身高 1.75,每天早上跑完步,回去 吃 东西
# 小美今年17岁,身高 1.65,小美不跑步,小美喜欢 吃 东西
# 定义类:类名的定义,使用class 来定义一个类
# class 类名: 类名一般需要遵守大驼峰命名法,每一个单词的首字母都大写
# 1. class <类名>:
# 2. class <类名>(object):
class Student(object): # 关注这个类有哪些特征和行为
# 在 __init__ 方法里,以参数的形式定义属性,称之为属性
def __init__(self, name, age, height):
self.name = name
self.age = age
self.height = height
def run(self):
print(f'{self.name}正在跑步')
def eat(self):
print(f'{self.name}正在吃东西')
# 使用 Student 类创建了两个实例对象 s1 s2
# s1 和 s2 都会有name,age,height属性,同时都有run和eat 方法
s1 = Student('小明', 18, 1.75)
s2 = Student('小美', 19, 1.65)
# 根据业务逻辑,让不同的对象执行不同的行为
s1.run()
s1.eat()
s2.eat()
- self语句的使用
class Student(object):
# 这个属性直接定义在类里,是一个元组,用来规定对象可以存在的属性
__slots__ = ('name', 'age')
def __init__(self, x, y):
self.name = x
self.age = y
def sayHello(self):
print('大家好,我是', self.name)
# Student('张三', 18) 这段代码具体做了什么呢?
# 1. 调用 __new__方法,用来申请内存空间
# 2. 调用__init__ 方法传入参数,并让self 指向申请好的那段内存空间,填充数据
# 3. 让变量 s1 也指向创建好的这段内存空间
s1 = Student('张三', 18)
# print('0x%X:'% id(s1)) # 查看地址
print('s1 的名字是', s1.name)
# 谁调用self,self就是谁
s1.sayHello()
# 如果没有这个属性会报错
# print(s1.height)
# 直接使用等号给一个属性赋值
# 如果这个属性以前不存在,会给对象添加一个新的属性
# 动态属性
s1.city = '上海' # 给对象添加了一个city属性
# 如果这个属性以前存在,会修改这个属性对应的值
s1.name = '刘明'
print(s1.name) # '刘明'
__init__
魔法方法
# 魔法方法,也叫魔术方法,是类里的特殊的一些方法
# 特点:
# 1、不需要手动调用,会在合适的时机自动调用
# 2、这些方法,都是使用 __ 开始,使用 __结束
# 3、方法名都是系统规定好的,在合适的时机自己调用
# import time
import datetime
n = datetime.datetime(2021, 4, 13, 8, 40, 54, 900)
print(n) # 调用 __str__ 方法
print(repr(n)) # 调用 __repr__ 方法
class Person(object):
def __init__(self, name, age):
# 在创建对象时,会自动调用这个方法
print('__init__方法被调用了')
self.name = name
self.age = age
def __del__(self):
# 当对象被销毁时,会自动调用这个方法
print('__del__方法被调用了')
def __repr__(self):
return 'hello'
def __str__(self):
# return self.name, self.age # 报错,TypeError: __str__ returned non-string (type tuple)
return '{} {}'.format(self.name, self.age)
def __call__(self, *args, **kwargs):
# print('__call__方法被调用了')
# args 是一个元组,保存(1, 2)
# kwargs 是一个字典, 保存{'fn':lambda: x, y: x + y}
print("args = {}, kwargs = {}".format(args, kwargs))
fn = kwargs['fn']
return fn(args[0], args[1])
p = Person('zhangsan', 18)
# 如果不做任何的修改,直接打印一个对象,是文件的__name__.类型 内存地址
# 当打印一个对象的时候,会调用这个对象的__str__ 或者 __repr__ 方法
# 如果这两个方法都写了,选择 __str__
print(p)
# print(repr(p)) # 调用内置函数 repr 会触发对象的 __repr__ 方法
# print(p.__repr__()) # 魔法方法,一般不手动的掉一共
# del p
# time.sleep(5)
# p() # 对象名() ==> 调用这个对象的 p.__call__() 方法
m = p(1, 2, fn=lambda x, y: x + y) # 调用这个对象的 p.__call__(1, 2) 方法
# print(m)
__eq__
方法的使用功能
class Person(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __eq__(self, other):
# print('__eq__ 方法被调用了')
# if self.name == other.name and self.age == other.age:
# return True
# return False
return self.name == other