python类和对象
一、类和对象
1.类定义
类是一类事务的抽象概念(模型),部署真实存在的,描绘了该事物共同的特征和行为
类可以用来封装一类事物共同的特征和行为
特征:属性
属性:定义在类里面的变量
行为:方法(函数)
方法:定义在类里面的函数
2.类的关键字:class
3.语法:
方式一:
class 类名:
#类的属性和方法
方式二:
class 类名 (object):
#类的属性和方法
4.类名定义的规范:
- 1.遵循标识符的命令规范
- 2.严格遵循大驼峰命名法(每个单词第一个字母必须大写)
二、类的属性
1.类作用
可以用来封装属性和方法
2.属性:
定义在类里面的变量
类属性:直接定在在类里面的变量(这个类的每个对象都有这个属性,而且属性值是一样的)
对象属性(实例属性):这一类事物都可能会有这个属性,属性值有可能不一样
3.对象属性的定义及赋值:
方式一:通过对象进行赋值:
对象.属性=属性值
方式二:通过初始化方法__init__进行定义
self.属性=属性值
4.类属性例子
例子:属性的赋值,获取属性的值
例子1:
class Cat:
attr1 = "喵喵喵"
attr2 = "长毛"
attr3 = "爱吃鱼"
#通过对象添加属性
c1=Cat()
c1.name="叮当猫"
c1.gender="公"
c1.age=18
例子2:
class Cat:
attr1 = "喵喵喵"
attr2 = "长毛"
attr3 = "爱吃鱼"
def __init__(self,name,gender,age):
#通过类去创建对象的时候,该方法会自动调用
#初始化对象属性
print("这个是self",self)
print(name, gender, age)
self.name = name
self.age = age
self.gender = gender
print("init方法创建对象的时候自动调用")
c1=Cat("叮当猫","公猫",18)
print("这个是c1",c1)
例子2输出:
5.方法:定义在类里面的函数
6.对象:通过类创建出来的,拥有这个类所有的特征和行为
通过类创建对象:
obj=类名()
self:代表的是对象本身,哪个对象去调用方法,self代表的就是哪个对象
三、类的方法【对象方法】
1.类里面的方法:self
- 类里面定义的函数叫方法
- 方法的第一个参数必须写成self(这个规范)
2.通过对象获取属性
print(c1.attr1)
3.使用对象去调用方法:
对象.方法名 c1.skill1()
4.类不可以直接调用方法
注意:类不可以直接调用方法,会提示少一个参数self
5.例子
通过对象获取属性
print(c1.attr1)
print(c2.attr1)
#使用对象去调用方法: 对象.方法名
c1.skill1()
#属性访问和方法的调用
#对象可不可以访问类属性
print(c1.attr1) #可以的
#对象可不可以访问对象属性
print(c1.name) #可以的
#对象可不可以调用方法
c1.skill1() #可以的
#类可不可以访问类属性
print(Cat.attr1) #可以的
#类可不可以访问对象属性
print(Cat.name) #不可以的
#类可不可以调用方法
print(Cat.skill1()) #不可以,会提示少一个参数self,【原因缺少一个对象】
四、类的方法【静态方法,私有属性】
1.类属性:定义在类里面的变量
- 公有属性:在类外面,通过类和对象都可以访问
- 私有属性:只能在类里面访问,类外面是不能去访问的
2.私有属性(双下划线)的定位:
- 以单下划线开头 _attr=10【在类外面可以使用,但是大家不用去使用】
- 以双下划线开头 __attr=200【在类外面不能直接访问】
- 扩展:双下划线开头的私有属性,在保存的时候其实换了个名字(__属性 --》 _类名__属性)
print(t1._TestClass__attr)
print(TestClass._TestClass__attr)
3.例子
class TestClass:
attr=100
_attr = 10
__attr = 200
t1=TestClass()
print(t1.attr)
print(TestClass.attr)
print(t1._attr)
print(t1._TestClass__attr)
print(TestClass._TestClass__attr)
输出:
100
100
10
10
10
4.对象方法(实例方法):
- 1.通过对象去调用的:对象.方法名
- 2.类不能直接访问对象方法。对象可以直接调用对象方法
- 3.对象方法的第一个参数,是self,self代表的是对象本身
- 4.只能通过对象去调用的:对象.方法名()
5.类方法@classmethod:
- 类方法的定义:在定义的方法前加一个@classmethod
- 类方法的第一个参数,是cls,cls代表的是类本身
- 既可以通过对象去调用也可以通过类去调用:对象.方法名 类.方法名()
- 应用场景:如果这个方法以类为主体去调用,方法内部不会涉及到对象属性和对象方法的使用,那么该方法就应该定义为类方法
6.静态方法@staticmethod:
- 静态方法的定义:在定义的方法前加一个@staticmethod
- 参数:没有必须要定义的固定参数
- 既可以通过对象去调用也可以通过类去调用:对象.方法名 类.方法名()
- 应用场景:方法内部既不会使用类属性和类方法,也不会使用对象属性和对象方法
7.例子
class TestClass:
attr=100
def __init__(self,name,age):
self.name=name
self.age=age
def func1(self):
print("对象方法一")
@classmethod
def func11(cls):
print("这个是类方法:func11")
@staticmethod
def func():
print("这个是静态方法:func")
t2=TestClass("小明",18)
#类不能直接访问对象方法。对象可以直接调用对象方法
t1=TestClass()
t1.func1()
#类方法
t1.func11()
TestClass.func11()