认识类和对象
1.什么是类:
拥有相同功能和相同属性的对象集合
什么是属性:
通俗的来说就是特点
对象就是类的实例(类,属性具体的表现)
类就是类型,类别(抽象的概念)
定义类(创建类):
用代码描述清楚这个类是拥有那些相同功能和那些相同属性的对象的集合
代码中的功能(函数)
代码中属性:
保存数据的变量
‘’’
创建类
语法:
class 类名:
类的说明文档
类的内容
说明:
class 关键字固定写法
类名 自己命名,名命要求 见名知意,采用驼峰式命名(类名首字母大写)
: 固定写法
类的说明文档 多行注释
类的内容 相同功能和相同属性,由方法(对象方法,类方法,静态方法)和属性(对象属性
类属性)组成
方法:定义在类中的函数
属性:定在类中的变量
‘’’
class Person:
'''说明文档 人'''
num = 61#num是属性
def eat(self):#eat是方法
print('吃饭')
def sleep(self):
print('睡')
创建对象
‘’’
语法:
类名() 创建指定类对应的一个对象,并将对象返回
‘’’
class Person:
'''说明文档 人'''
num = 61#num是属性
def eat(self):#eat是方法
print('吃饭')
def sleep(self):
print('睡')
p1 = Person()#p1就是对象
p2 = Person()
print(p1)
print(p2)
类的方法:
定义在类中的函数,描述类具备的功能
类的方法有三种
1.对象方法
2.类方法
3.静态方法
‘’’
对象方法
怎么定义:将函数直接定义在类中
整么调用:通过对象来调用:对象.xxx()
特点:自带参数self,通过调用对象方法的是参数self不需要传参,系统自东将当前对象传给self
(self谁调用指向谁)
什么时候用:如果实现函数的功能需要用到对象属性就使用对象方法
类方法
怎么定义:定义函数前加装器’@classmethond‘
整么调用:通过类来调用:类名.
特点:自带参数cls,调用的时候不需要传参,系统自动将参数传给cls
什么使用:如果实现函数的功能不需要对象属性需要类就是用类方法
静态方法
怎么定义:定义函数前加装饰器’@staticmethod’
整么调用:通过类来调用
特点:没有特点
生么时候用:实现函数功能示既不是用对象属性也不行需要类
‘’’
class A:
def fucn1(self):
print(f'self:{self}')
print('对象方法')
def fucn11(self,x,y,):
print('对象方法2')
@classmethod
def func2(cls):
print('类方法')
@staticmethod
def func3():
print('静态方法')
a = A()
b = A()
print(f'a:{a}')
# 通过对象调用对象方法
a.fucn1()
# 通过类调用类方法
A.func2()
# 通过调用类来使用静态方法
A.func3()
魔法方法
方法名以’‘开头并以’'结尾的自带的方法:就是魔法方法
所有的魔法方法都会在特定的情况下自动调用
常用的魔法方法:
1.__init__方法,
2.__repr__方法
__init__方法 :创建类的对象的时候会自动调用类中的__init__方法,
class B:
def __init__(self):
print('init方法')
b1 = B()
b2 = B()
class C:
# 在类添加__init__方法的时候,除了方法名和方法类型不能动,可以随意添加参数和随意添加函数体
def __init__(self,x,y,):
print('c的init方法',x ,y )
# 创建类的对象的时候需不需要参数,需要几个参数,由类中__init__方法决定
c = C(0,8)
# __repr__:打印对象的时候会自动调用对象对应的类中的__repr__方法,来制定打印规则(函数的
# 返回值是什么,对象打印结果就是什么)返回值必须是字符串
class A:
def __repr__(self):
return 'abc'
pass
a =A()
print(f'a:{a}')
属性;对象属性,类属性
类属性怎么创建:
在类中直接定义一个变量,这个变量就是属性
#怎么使用:通过类来使用
什么时候用:
当属性值不会因为对象不同而不一样的时候就是用类属性
class A:
x = 100#x就是类属性
print(A.x)#直接使用后
A.x = 200#修改类属性的值
print(A.x)
对象属性怎么创建:
以‘self.属性名=值’的形式定义在类__init__方法
怎么使用:
通过对象来使用(对象.属性名)
什么时候用:
当属性值会因为对象不同而不一样就要使用类熟悉
class A:
def __init__(self):
self.name = '小明'
self.mun = '10'
a = A()
print(a.name,a.mun)
a.name = '小花'
a.mun = 18
print(a.name,a.mun)
练习:定义一个圆的类,拥有属性:半径和圆周率,拥有的方法:求周长和求面积
class Circle:
def __init__(self):
self.r = 1
pi = 3.1415926
# 类中实现函数功能的时候乳沟需要的数据是属性,不需要提供额外的参数
def geet_area(self):
# 如果需要的类属性直接使用类来提供
# 如果需要对象属性用self来提供
return Circle.pi * self.r ** 2
def get_perimeter(self):
return 2 * Circle.pi * self.r
c1 = Circle()
print(c1.geet_area(),c1.get_perimeter())
c2 = Circle()
c2.r = 5
print(c2.geet_area(),c2.get_perimeter())
对象属性赋初始值的方式
‘’’
1.self.属性名 = 值 :赋一固定的值
‘’’
class Person:
def __init__(self,name,gender='男'):
self.age = 1
self.name = name#使用没有默认值的参数来赋值
self.gender = gender#使用有默认值的参数来赋值
p1=Person('小明')
print(p1.name,p1.age,p1.gender)
p2 = Person('小花','女')
print(p2.name,p2.gender,p2.age)
练习2:创建一个矩形类
class Rectangle:
def __init__(self,long = 2,wide = 3):
self.long = long
self.wide = wide
def area(self):
return self.long * self.wide
def perimeter(self):
return (self.long + self.wide) * 2
def __repr__(self):#能制定打印规则
# return str(self.__dict__)
return f'长度:{self.long},宽:{self.wide},面积:{self.area()},周长:{self.perimeter()}'
a = Rectangle(6,5)
print(a)
在面向对象编程的时候,可以使用对象代替字典,字典能做到的功能,对象也都能做到
class na:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
da = na('小明',18,'男')
da1 = na('小红',19,'女')
属性的增删改查
查:获取属性值
查单个:对象.属性(获取指定属性的值,属性不存在报错)
class na:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
da = na('小明',18,'男')
da1 = na('小红',19,'女')
print(da.name)
print(da1.age)
getattr(对象,‘属性名’)(获取指定属性的值,属性不存在报错)
class na:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
da = na('小明',18,'男')
da1 = na('小红',19,'女')
print(getattr(da,'age'))
print(getattr(da1,'gender'))
getattr(对象,‘属性名’,默认值) (获取指定属性的值)属性不存在直接返回默认值
class na:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
da = na('小明',18,'男')
da1 = na('小红',19,'女')
print(getattr(da,'成绩',100))
print(getattr(da1,'成绩',88))
增,改
对象.属性 = 值 (当属性存在的时候修改指定的属性对应的值,当属性不存在的时候,是给对象添加属性)
class na:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
da = na('小明',18,'男')
da1 = na('小红',19,'女')
da.name='大聪明'
print(da.name)
da.age = 88
print(da.age)
setattr(对象,‘属性名’,‘值’) (当属性存在的时候修改指定的属性对应的值,当属性不存在的时候,是给对象添加属性)
attr相关函数可以动态操作对象属性
class na:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
da = na('小明',18,'男')
da1 = na('小红',19,'女')
setattr(da1,'name','小玉')
print(da1.name)
setattr(da1,'成绩',99)
print(da1.成绩)
删
hasattr(对象,属性名)判断属性是否存在
del对象.属性 () 删除指定对象的值,从内存中删除
class na:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
da = na('小明',18,'男')
da1 = na('小红',19,'女')
del da.name
print(hasattr(da,'name'))
delattr(对象,属性名) 删除指定对象的值
class na:
def __init__(self,name,age,gender):
self.name = name
self.age = age
self.gender = gender
da = na('小明',18,'男')
da1 = na('小红',19,'女')
delattr(da1,'name')
print(hasattr(da1,'name'))
继承
什么是继承:
让子类直接拥有父类的属性和方法
子类父类:
父类就是大的类,父类下面的分支的小类就是子类
继承语法:
‘’’
class 类名(父类):
类的说明文档
类的类容
注意:定义类的时候如果没有写父类,这个默认继承object(基类)
‘’’
class A:
a = 100
def __init__(self):
self.b= 10
self.c=20
def funcl(self):
print('对象方法')
@classmethod
def func2(cls):
print('类方法')
@staticmethod
def func3():
print('静态方法')
class B(A):
pass
v= B()
print(v.a)
print(v.func3())
print(v.func2())
子类添加类容
子类在拥有父类的属性和方法的同时,往往需要有属于自己特有的一些属性和方法
添加类属性和方法:
直接在子类中定义新的类属性和方法
添加对象属性
需要在子类的__init__方法中通过super()去调用父类的__init__方法来继承父类的对象属性
class A:
a = 100
def __init__(self):
self.b= 10
self.c=20
def funcl(self):
print('对象方法')
@classmethod
def func2(cls):
print('类方法')
@staticmethod
def func3():
print('静态方法')
class C(A):
m = 11
def __init__(self):
super().__init__()#调用当前的父类的__init__()
self.name = '小明'
# def __init__(self): 这样子类能使用,但是父类会报错
# self.name = '小明'
def func4(self):
print('C的对象方法')
@classmethod
def cun5(cls):
print('C的类方法')
@staticmethod
def cun6():
print('C的静态方法')
print(C.a,C.m)