主要分享一下自己在学习python中关于类和实例的基本概念以及用法,因为在写自动化测试用例的时候会使用类跟方法进行封装,使代码更加的简洁干净,以下是自己的一些学习心得
1.类跟实例的基础概念
类:是抽象的模板,比如动物类
定义类的语法:
class
后面紧接着是类名,即Animals,类名通常是大写开头的单词,紧接着是(object),表示该类是从哪个类继承下来的,通常,如果没有合适的继承类,就使用object类,这是所有类最终都会继承的类。object继承的类也可以不写#写法1 class Animals(object):pass #写法2 class Animals1():pass
实例:是根据类创建出来的一个个具体的对象,比如从动物类创建的“狮子”
实例的语法:通过类型+()实现
#第一步先定义类 class Animals():pass #第二步实例化一个对象dog dog=Animals() #可以给实例绑定属行,比如dog会叫汪汪汪 dog.say='汪汪汪' print(dog.say) #汪汪汪
2.类变量和实例变量
类变量:就是该类所有实例共享的属性和方法,也叫类属性,所有由此类实例化的对象都有此属性,并且不能修改,比如定义一个动物类,他们都属于大自然,不管实例化成的狮子,老虎。兔子他们都有一个共同的属性都属于大自然,类属性的一个常见用途是存储与类相关的常量或共享的状态信息。例如,可以在类属性中存储数据库连接信息、默认配置或类的共享状态。
#共有类属性 class Animals():from='大自然'pass #实例化一个dog dog=Animals() print(dog.from) #大自然 #实例化一个cat cat=Animals() print(cat.from) #大自然
拓展: 针对类可以定义一些私有属性,两个下划线开头的属性是私有的(private)。其他为公共的(public),类内部可以直接访问私有属性,类的外部不能直接访问私有属性,类外部可以通过”_类名__私有属性名“ 访问私有属性
#定义一个动物类 class Animals():from_1='大自然' #类属性,不管多少个实例,这个不会变化__owner='chy' #类的私有属性,主人是chydef __init__(self,say):self.say=say #实例属性,不同实例有不同的值self.owner=self.__owner #类的内部直接调用类的私有属性 #实例化一个dog dog=Animals('汪汪汪') print(dog.from_1) print(dog.say) print(dog.owner) print(Animals._Animals__owner) #类的外部调用私有属性(类名._类名__私有属性)
实例变量:每个实例独有的属性也叫实例属性,这种定位位实例变量,比如定义一个动物类,每个动物都有叫声,但是叫声都不同,这个是属于不同实例的独有属性,就要定义为实例属性;定义实例属性一般使用
__init__
方法,此方法第一个参数永远是self
,表示创建的实例本身,因此,在__init__
方法内部,就可以把各种属性绑定到self
,因为self
就指向创建的实例本身。#定义一个动物类 class Animals():from_1='大自然' #类属性,不管多少个实例,这个不会变化def __init__(self,say):self.say=say #实例属性,不同实例有不同的值 #实例化一个dog dog=Animals('汪汪汪') print(dog.from_1) print(dog.say) #实例化一个cat cat=Animals('喵喵喵') print(cat.from_1) print(cat.say)
拓展:针对实例属性可以定义一些私有的实例属性,这些私有属性的定义是在前面加两个下划线,私有属性可以在类中调用,如果在类外部被调用通过 ”_类名__私有属性名“ 访问私有属性
#定义一个动物类 class Animals():from_1='大自然' #类属性,不管多少个实例,这个不会变化def __init__(self,say,age):self.say=say #实例属性,不同实例有不同的值self.__age=age #定义的私有实例属性def __test(self):print(self.__age) #类的内部调用私有的实例属性 #实例化一个dog dog=Animals('汪汪汪','18') print(dog._Animals__age) #类的尾部调用私有的实例属性
3.类属性绑定/实例属性绑定
在定义类时,通常我们说的定义属性,其实是分为两个方面的:类属性绑定、实例属性绑定,用绑定这个词更加确切;不管是类对象还是实例对象,属性都是依托对象而存在的。我们说的属性绑定,首先需要一个可变对象,才能执行绑定操作,使用objname.attr = attr_value的方式,为对象objname绑定属性attr,属性的绑定发生在两个地方,类定义时候,运行是任意阶段
这分两种情况:
若属性attr已经存在,绑定操作会将属性名指向新的对象;
class Animals1():from_1 = '大自然' # 类属性from_1的属性已经存在def __init__(self):self.say='汪汪汪'#实例属性已经存在Animals1.from_1 = '动物园' # 类属性修改成一个新的属性,此时from_1的属性会指向新的对象
dog1=Animals1()
dog1.say='喵喵喵'#实例属性修改成一个新的属性
print(Animals1.from_1) # 动物园
print(dog1.say)#喵喵喵
若不存在,则为该对象添加新的属性,后面就可以引用新增属性
class Animals2():# 没有任何的属性def __init__(self,say):self.say=say
Animals2.from_1 = '动物园1' # 新增一个类属性
print(Animals2.from_1) # 动物园1
dog2=Animals2('汪汪汪')
dog2.name='jim' #新增一个实例属性
print(dog2.name)#jim
4.类属性引用/实例属性引用
4.1 类属性的引用
类属性的引用分为两种:数据属性,函数属性
数据属性的引用:
class Animals():from_1='动物园' print(Animals.from_1) #数据属性的引用
函数属性的引用:
class Animals():jiao='汪汪汪'def say():print(Animals.jiao) Animals.say() #函数属性的引用
4.2 实例属性的引用
总是先到实例对象中查找属性,再到类属性中查找属性,如果实例属性跟类属性都有的时候,优先实例属性,如果实例属性中没有的时候再去找类属性
class Animals():from_1='大自然' #类属性中有此age='3'def __init__(self,say,from_1):self.say=sayself.from_1=from_1 #实例属性中有此 #实例化一个具体的动物狗 dog=Animals('汪汪汪','d动物园') print(dog.from_1) #动物园 类属性跟实例属性都有此,优先实例属性所以打印出来的是动物园 print(dog.age) #3,只有类属性中有此,所以值输出类属性中的值
属性绑定语句总是为实例对象创建新属性,属性存在时,更新属性指向的对象,如果类属性中有某一个属性,但是实例属性中没有此属性 ,使用实例绑定一个类中的属性,此时实例中增加一个实例属性,类属性中不变。
class Animals():from_1='大自然'def __init__(self,say):self.say=say #实例化一个动物狗 dog=Animals() dog.from_1='动物园' #给实例新增了一个属性 print(dog.from_1) #动物园 print(Animals.from_1) #大自然,不会更新类属性
5.类方法/实例方法
类方法:@classmethod
装饰器定义的方法,用于操作类级别的属性。它必须包含一个 cls
参数,该参数代表类本身,可以通过类名或实例调用类方法。
class Animals:from_1='大自然'@classmethod #装饰器定义下面的方法是一个类方法def class_method(cls):print("This is a class method")print(cls.from_1)
#调用方法
Animals.class_method
实例方法:,用于操作实例的属性。它必须包含一个 self
参数,该参数代表类的实例。通过实例调用实例方法,会自动传入实例参数。
class MyClass:def instance_method(self):print("This is an instance method")# 创建实例
obj = MyClass()# 调用实例方法
obj.instance_method()
静态方法:是使用 @staticmethod
装饰器定义的方法,它与类和实例无关。静态方法不接受特殊的第一个参数(self
或 cls
),因此无法直接访问实例变量或类变量。
class MyClass:@staticmethoddef static_method():print("This is a static method")# 调用静态方法
MyClass.static_method()