一、类在的方法
1.类的方法
定义类就是描述清楚这个类是拥有哪些相同的功能和属性的集合。
类中的方法就是对类相同的功能的描述
1)什么是方法
方法就是定义在类中的函数, 它分为三类:对象方法、类方法、静态方法
2. 三种方法
1)对象方法
怎么定义:直接定义在类中的函数就是对象方法
特点: 自带参数self(如果使用对象去调用对象方法,对象方法中self不用传参,系统会自动将当前对象传给self)
self指向当前对象
怎么调用:对象.方法()
2)类方法
怎么定义:在定义函数前加 @classmethod
特点:自带参数cls(如果使用类去调用类方法,方法中的cls不用传参,系统会自动将当前类传给cls)
cls指向当前类
怎么调用:类.方法()
3)静态方法
怎么定义:在定义函数前加 @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}')
print(f'p2:{p2}')
p2.eat()
p1.sleep()
p1.eat('面条')
Person.show_num()
Person.show_num(60)
Person.show_message()
# 注意: 从语法来角度来看,不管是对象方法、类方法还是静态方法都可以使用类和对象调用(但是实际开发不要这样做)
Person.eat('xx') # 不合理
p1.show_num()
p1.show_message()
二、构造函数和init
1.什么是构造函数 - 函数名和类同名的用来创建的对象的函数/方法
a.函数名和类名同名 b.功能是用来创建对象的
python中,当我们在定义类的时候,系统会自动创建这个类的构造函数。在这个构造方法中会自动调用
__new__方法来创建对象,并且用这个创建好的对象来调用__init__对对象进行初始化操作,最后才将对象返回。
2.__init__方法
__init__是每个类中都有一个特殊的对象方法, 是魔法方法(会被自动调用);当创建类的对象的时候这个类
中的__init__方法会被自动调用。
在类中添加__init__方法,只需要保证方法名是__init__, 方法是对象方法。
class Dog:
def __init__(self, x):
print('init方法')
print(x)
1)当调用构造方法创建对象的时候,系统自动调用这个类中 init 方法
2)调用构造方法创建对象的时候,这个构造方法需不需要参数,需要几个参数,看类中的__init__方法除了self以外需不要参数,
需要几个参数
dog1 = Dog(10)
dog2 = Dog(x=100)
三、类中的属性
1.什么是属性
我们通过类中的属性来保存类相关的属性
2.属性的分类
类中的属性分为两种:类属性和对象属性
1)类属性(类的字段)
a.定义:直接定义在类中的变量就是类属性
b.使用:类.属性
c.什么时候用:属性值不会因为对象不同而不一样的时候,就使用类属性
2)对象属性
a.定义:在__init__方法中,以 self.属性=值 的形式进行定义 (属性自己命名,要求和规范和变量名一样)
b.使用:对象.属性
c.什么时候用: 属性值会因为对象不同而不一样的时候,就使用对象属性
a = 100
class Student:
# num就是类属性
num = 30
def __init__(self):
# name和age, score就是对象属性
self.name = '张三'
self.age = 18
self.score = 0
print(a)
print(Student.num)
stu = Student()
print(stu.name, stu.age, stu.score)
stu2 = Student()
print(stu.name, stu.age, stu.score)
print(stu2) # <__main__.Student object at 0x104853510>
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)
p2 = Person('小花', '女')
print(p2)
四、对象属性的增删查改
1.对象属性
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'