- 1. 类
- 2. 类的方法
- 3. 魔法方法
- 4. 属性
- 4. 属性增删改查
- 5. 继承
- 练习题
类是拥有相同功能和相同属性对象的集合。
对象就是类的实例。
定义类的语法:
class 类名():
类的说明文档
类的内容
类名:采用驼峰式命名并且首字母大写,类名大写开头。
类的说明文档:多行注释。
类的内容:相同功能和相同属性,由方法(对象方法、类方法、静态方法)和属性(对象属性、类属性)组成。方法是定义类中的函数。属性是定义类中的变量。
- 创建类:
基本结构:
class Person:
"""人类"""
num=61 # num是属性
def eat(self): # eat是方法
print('吃饭')
def sleep(self):
print('睡')
- 创建对象
语法:
类名() -> 创建指定类对应的一个对象,并将对象返回
p1 = Person() p2 = Person() print(p1) # <__main__.Person object at 0x10ab77ca0> print(p2) # <__main__.Person object at 0x10ab77c70>2. 类的方法
方法: 是定义在类中的函数,用来描述具备的功能
类中的方法有三种:对象方法、类方法、静态方法
- 对象方法
a. 怎么定义:将函数直接定义在类中
class A:
def func1(self):
print(self) # <__main__.A object at 0x100dde7f0>
print('对象方法') # 对象方法
def func11(self, x):
print('对象方法2') # 对象方法2
b.怎么调用:通过对象来调用,对象.xxx()
a = A() print(a) # <__main__.A object at 0x10d4f97f0> # 通过对象调用对象方法 a.func1() a.func11(100)# 对象方法2
c.特点:自带参数self,通过对象调用对象方法时参数self不需要传参,系统自动传参给self,a就是self,self,谁调用谁就指向谁。
d.如果实现函数的功能需要用到对象属性就使用对象方法
- 类方法
a. 怎么定义: 定义函数前加装饰器‘@classmethod’
class A:
@classmethod
def func2(cls):
print('类方法')
b.怎么调用:通过类来调用 ,类名.xxx()
# 通过类调用类方法 A.func2()
c.特点:自带参数cls,调用时不需要传参,系统自动将当前类传给cls。
d.如果实现函数的功能不需要用到对象属性,需要类就使用类方法
3. 静态方法
a. 怎么定义:定义函数前加装饰器‘@staticmethod’
class A:
@staticmethod
def func3():
print('静态方法')
b.怎么调用
# 通过类调用静态方法 A.func3()
c.特点:没有特点
d.实现函数的功能既不需要用到对象属性也不需要类就使用静态方法
方法名以’'开头并且以‘’结尾的自带的方法,就是魔法。
所有的魔法方法都会在特定情况下被自动调用。
常用的魔法方法:__init__方法、repr 方法。
1)repr
在打印对象的时候会自动调用对象对应的类中的__repr__方法,来定制打印规则。函数的返回值是什么对象的打印结果就是什么。返回值必须是字符串。
class A:
def __repr__(self):
return 'abc'
a = A()
print(a) # abc
2)init
创建类的对象时被自动调用类中的__init__ 方法。
class B:
def __init__(self):
print('init方法')
b1 = B() # init方法
class C:
# 在类中添加__init__方法时,除了方法名和方法类型不能动,可以随意添加参数和函数体
def __init__(self, x, y):
print('init方法',x,y)
#创建类的对象时需不需要参数,需要几个参数,由__init__方法决定
c1 = C(1,2) # init方法 1 2
4. 属性
- 类属性
a. 怎么创建:在类中直接定义一个变量。
class A:
# x是类属性
x = 100
b. 怎么使用:通过类来使用 -> 类.xxx
# 使用类属性 print(A.x) # 100 # 修改类属性的值 A.x=200 print(A.x) # 200
c. 什么时候用:当属性值不会因为对象不同而不一样时就使用类属性。
2. 对象属性
a. 怎么创建
‘self.属性名=值’的形式定义在类的 __init__的方法
class A:
# name num是对象属性
def __init__(self):
self.name = '小明'
self.num = 10
b. 怎么使用 通过对象来使用 -> 对象.属性名
# 使用对象属性 a = A() print(a.num,a.name) # 10 小明 # 修改对象属性的值 a.name = '小花' a.num = 11 print(a.name, a.num)
c. 什么时候用
练习1:定义一个圆的类,拥有属性:半径和圆周率,拥有的方法:求周长和求面积。
class Circle:
# 类属性
pi = 3.14
# 属性 对象还是类 半径是对象属性(有可能不一样) 圆周不会因为对象不同不一样,是类属性直接:变量名=值
def __init__(self):
self.r = 1
# 两个方法 定义两个函数,用到了r和pi对象方法
# 在类中实现函数功能 如果需要的数据是属性,不需要提供额外的参数
def zc(self):
# 使用类属性Circle.pi
# 对象属性 用self
return Circle.pi * self.r ** 2
def mj(self):
return Circle.pi * self.r * 2
c1 = Circle()
c2 = Circle()
c2.r = 3
print(c1.zc(), c2.zc())
- 对象属性赋初始值的方法
class Person:
def __init__(self, name, gender='男'):
self.name = name # 使用没有默认值的参数来赋值
self.age = 1 # 赋固定值
self.gender = gender # 使用有默认值的参数来赋值
def __repr__(self):
# return f'name:{self.name}, age:{self.age}, gender:{self.gender}'
return str(self.__dict__)
p1 = Person('小明')
print(p1.name, p1.age, p1.gender) # 小明 1 男
p2 = Person('小花', '女')
print(p2.name, p2.age, p2.gender) # 小花 1 女
练习2:创建一个矩形类(根据生活扩展类的内容)
class rectangle:
def __init__(self, length, width):
self.length = length
self.width = width
def Perimeter(self):
return 2 * (self.length + self.width)
def area(self):
return self.width * self.length
# def __repr__(self):
a = rectangle(2, 3)
print(a.Perimeter(), a.area())
4. 属性增删改查
- 在面向对象编程的时候,可以直接使用对象来代替字典。
class Student:
def __init__(self, name, age=18, score=0):
self.name = name
self.age = age
self.score = score
def __repr__(self):
return str(self.__dict__)
stu1 = Student('小明', 12, 67)
stu2 = Student('小花', 19, 100)
print(stu1,stu2) # {'name': '小明', 'age': 12, 'score': 67} {'name': '小花', 'age': 19, 'score': 100}
- 对象的对象属性支持增删改查
1)查- 获取属性值
a. 对象.属性 获取指定属性的值
b. getattr(对象,属性名) 获取指定属性的值
c. getattr(对象,属性名,默认值) 获取指定属性的值,属性不存在在直接返回默认值。
print(stu1.name) # 小明 print(getattr(stu1,'name')) # 小明 print(getattr(stu1, 'gender', '男')) # 男
2)增、改
a. 对象.属性=值 当属性存在时,修改属性对应的值,当属性不存在时给对象添加属性。
b.setattr(对象,属性名,值) 当属性存在时,修改属性对应的值,当属性不存在时给对象添加属性。
stu1 = Student('小明', 12, 67)
stu2 = Student('小花', 19, 100)
stu1.age=22
print(stu1) # {'name': '小明', 'age': 22, 'score': 67}
setattr(stu1, 'study_id', '001')
print(stu1) # {'name': '小明', 'age': 22, 'score': 67, 'study_id': '001'}
value = input('请输入你想要查看的属性:')
# print(stu1.value)
print(getattr(stu1, value))
3)删
a. del 对象.属性
b. delattr(对象,属性名)
del stu1.age
print(stu1) # {'name': '小明', 'score': 67}
delattr(stu1, 'name')
print(stu1) # {'age': 12, 'score': 67}
- 判断是否存在
print(hasattr(stu1, 'name')) # False
print(hasattr(stu1, 'score')) # True
if not hasattr(stu1, 'name'):
stu1.name = '小明'
5. 继承
让子类直接拥有父类的属性和方法
父类就是一个大类,子类是这个大的类下面的一个小的分类。定义类的时候如果没有写父类,默认继承object。
语法:
class 类名(父类):
类的说明文档
类的内容
子类添加内容
子类在拥有父类的属性和方法的同时,往往需要由属于自己特有的一些属性。
1)添加类属性和方法
直接在子类中定义新的类属性和新的方法
class A:
a = 100
def __init__(self):
self.b = 10
self.c = 20
def func1(self):
print('类方法')
@classmethod
def func2(cls):
print('对象方法')
@staticmethod
def func3():
print('静态方法')
class B(A):
pass
# print(B, a)
x = B()
print(x.b, x.c) # 10 20
x.func1() # 类方法
x.func2() # 对象方法
B.func3() # 静态方法
子类添加内容
子类在拥有父类的属性和方法的同时,往往需要由属于自己特有的一些属性和方法。
1)添加类属性和方法
直接在子类中定义新的类属性和新的方法
2)添加对象属性
需要在子类的__init__方法中通过super()去调用父类的__init__方法来继承父类的对象属性。
class C(A):
m = 11
def __init__(self):
super().__init__() # 调用当前类的父类的__init__()
self.name = '小明'
def func11(self):
print('C的对象方法')
@classmethod
def func22(cls):
print('C的类方法')
@staticmethod
def func33():
print('C的静态方法')
def func1(self):
print('C的对象方法2')
print(C.a, C.m) 100 11
x = C()
print(x.name) # 小明
print(x.b, x.c) # 10 20
练习题
-
定义一个狗类和一个人类:
狗拥有属性:姓名、性别和品种 拥有方法:叫唤
人类拥有属性:姓名、年龄、狗 拥有方法:遛狗
class People: def __init__(self, name='小明', age=18, dog='小白'): self.name = name self.age = age self.dog = dog def walkdog(self): return f'{self.age}岁的{self.name}溜{self.dog}' a = People() print(a.walkdog()) class Dog: def __init__(self,dogname='小白',gender='公狗',varieties='柯基'): self.dogname=dogname self.gender=gender self.varieties=varieties def bark(self): return f'一只名{self.dogname}的{self.varieties}:在叫' b = Dog() print(b.bark()) -
定义一个矩形类,拥有属性:长、宽 拥有方法:求周长、求面积
class Rectangle: def __init__(self, length, width): self.length = length self.width = width def Perimeter(self): return 2 * (self.length + self.width) def area(self): return self.length * self.width a = Rectangle(2, 3) print(a.Perimeter(), a.area()) -
定义一个二维点类,拥有属性:x坐标、y坐标 拥有方法:求当前点到另外一个点的距离
class Dimensional: def __init__(self,x=0,y=0): self.x=x self.y=y def point2(self,other): return ((other.x-self.x)**2+(other.y-self.y)**2)**0.5 a=Dimensional(-69,80) a1=Dimensional(8,100) print(a.point2(a1)) -
定义一个圆类,拥有属性:半径、圆心 拥有方法:求圆的周长和面积、判断当前圆和另一个圆是否外切
class Circle: pi = 3.14 def __init__(self, r, x, y): self.r = r self.x = x self.y = y def l(self): return 2 * Circle.pi * self.r def s(self): return Circle.pi * (self.r) ** 2 def circle2(self, other): return (other.y - self.y) ** 2 + (other.x - self.x) ** 2 == other.r + self.r a1 = Circle(4, 2, 2) a2 = Circle(4, 9, 4) print(a1.l(),a1.circle2(a2)) -
定义一个线段类,拥有属性:起点和终点, 拥有方法:获取线段的长度
class Line: def __init__(self,x1,y1,x2,y2): self.x1=x1 self.y1=y1 self.x2=x2 self.y2=y2 def l(self): return ((self.y2-self.y1)**2+(self.x2-self.x1)**2)**0.5 a=Line(0,0,3,4) print(a.l()) -
写一个斗地主游戏类(根据生活经验添加类的内容)



