类:是一个事物的抽象概念。描述该类事物共同的特征和行为
实例对象:某类事物的具体个体
1、类的定义
方式一、
calss 类名:
pass
方式二、
class 类名(object):
pass
类名的规范:
1、遵循大驼峰额命名规范(每个单词的首字母大写)
2、可以由数字字母下划线组成,不能用数字开头,不要使用关键字
2、 实例化对象
语法:
对象 = 类名()
万物皆对象:所有的数据都是对象
字符串:str类型的对象
列表:list类型的对象
# 猫类
class Cat():
pass
# 实例化对象coffie
coffie = Cat()
3、类的属性和方法
1、属性
1)类属性:这类事物都具备这个属性,并且属性值是一样 的
类属性是所有的对象共有
类属性的定义:直接定义在类里面的变量
类名.属性名 = 属性值
2)对象(实例)属性:对象自己的属性
实例属性的定义:对象.属性名 = 属性值
# 猫类
class Cat():
'''类属性'''
leg = 4
tail = 1
eye = 2
coffie = Cat()
# 对象属性
coffie.name = '咖啡猫'
2、方法:定义在类里面的函数叫做方法
方法中的参数除self之外,其他的参数传递和函数是一样的
方法中也是使用return来返回数据的
3、self:代表的是对象自己
class Cat:
# 类属性
leg = 4
tail = 1
eye = 2
def func(self):
print("{}正在抓老鼠".format(self.name))
def skill01(self):
print("这换个是爬树的功能")
# 通过猫类创建对象
coffee = Cat()
jingle = Cat()
coffee.name = "加菲猫"
jingle.name = "叮当猫"
# 通过对象调用方法
coffee.func() # 加菲猫正在抓老鼠
jingle.func() # 叮当猫正在抓老鼠
4、属性和方法的调用
类属性的调用:
1. 可以通过类去调用 ------> 类名.属性名
2. 可以通过对象去调用 --------> 对象名.属性名
实例属性的调用:
只能通过对象调用自己的属性
方法的调用:
1. 不能直接类调用(因为没有对象)
2. 只能通过对象直接调用
5、初始化方法
初始化方法__init__:在通过类创建对象的时候自动调用的
在创建对象的时候,给对象设置对象属性"
class Person:
attr = '类属性1111'
def __init__(self, name, age, sex):
"""在创建对象的时候,给对象设置对象属性"""
self.name = name
self.age = age
self.sex = sex
print("这个是---init-----")
musen = Person('MUSEN', 18, '男')
Try = Person('TRY', 18, '男')
print(musen.name)
print(musen.age)
print(musen.sex)
print(Try.name)
6、私有属性:仅供类的内部使用(不要在外部调用)
_单下滑线开头:表示一个私有属性(没有真正的私有化,类外部依然可以调用)
__双下滑线开头:表示一个私有属性(类外部不可以调用)
7、私有方法
_单下划线开头:表示这是一个私有方法(没有真正的私有化,类外部依然可以调用)
__双下滑线开头:表示这是一个私有方法(类外部不可以调用)
class MyTest:
_num1 = 1
__num2 = 2
def _func1(self):
print('单下划线')
def __func2(self):
print('双下划线')
def func(self):
print(self.__num2)
my = MyTest
print(my._num1) # 1
my._func1(my) # 单下划线
my.func(my) # 2
# print(my.__num2) # 不能直接调用 AttributeError: type object 'MyTest' has no attribute '__num2'
8、实例方法
1. 只能通过对象调用(第一个参数self:代表对象本身)
2. 适用场景:方法内部如果要使用对象的属性或者方法,就要定义成实例方法
9、类方法
类方法的定义:要先使用@classmethod声明
类方法:
1. 通过类调用,也可以通过对象调用
2. 适用场景:方法内部只使用类属性或者类方法(不需要使用对象属性和方法),适合定义为类方法
10、静态方法
静态方法的定义:要先使用@staticmethod声明
静态方法:
1. 可以通过类调用,也可以对象调用
2. 适用场景:方法内部(既不需要使用类属性和类方法,也不需要使用对象属性和对象方法),适合定义为静态方法
class MyTest:
num = 100
def __init__(self, name):
self.name = name
def func(self):
print(self.name)
# 类方法
@classmethod
def func1(cls):
print(cls.num)
# 静态方法
@staticmethod
def func2():
print('静态方法')
11、类的继承
作用:子类通过继承可以获得父类的属性和方法,提高开发的效率及代码的复用率。(__开头的私有属性和方法的除外)
重写父类方法:重写,就是子类中,有一个父类相同名字的方法,在子类中的方法会覆盖掉父类中的方法
调用重名的父类方法:子类重写了父类的方法之后,需要使用固定的语法进行调用
方式一:父类名.方法名(self)
方式二:super().方法名
class Phone:
def __init__(self, name):
self.name = name
def call(self):
print("打电话功能")
class PhoneV2(Phone):
def __init__(self, name, price):
super().__init__(name)
self.price = price
def music(self):
print(f"名称:{self.name},价格:{self.price},功能:听语音")
huawei = PhoneV2('P30', 7000)
huawei.call() # 打电话功能
huawei.music() # 名称:P30,价格:7000,功能:听语音
12、动态属性设置:setattr()
参数1:对象(类)
参数2:属性名
参数3:属性值
# 在代码执行的过程中,给类添加属性
class Demo:
atter = 100
Demo.name = 'bty'
# 把字典中的键值对设置为类的属性和属性值
data = {"name": "musen", "age": 18, "gender": "男"}
for k,v in data.items():
setattr(Demo,k,v)
print(Demo.__dict__)
13、动态获取属性:getattr()
参数1:对象(类)
参数2:属性名
参数3:(非必传)设置一个属性不存在时返回的默认值(不传,属性不存在则报错)