转:https://www.cnblogs.com/Eva-J/articles/7293890.html#_label7 ---------此讲解更全面
面向对象:万物皆对象
类: 关键字:class 命名的
语法:1.class 类名: 2.class 类名(object):
class Person:
类名规范:大写字母开头(如果有多个单词组成,那每个单词的第一个字母大写)
在python中,用变量表示特征,用函数表示技能,因而具有相同特征和技能的一类事物就是‘类’,对象是则是这一类事物中具体的一个
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def walk(self): #人都可以走路,也就是有一个走路方法,也叫动态属性 print("person is walking...")
实例对象:类创造的对象,归属于类之下的实例 man = Person()
属性:
类属性:每一个实例对象都有,而且值是一样的,直接定义在类里面的变量
私有属性:属性名以单下划线或者双下划线开头的被称之为私有属性 _role __role
实例对象属性:通过实例对象.属性名进行赋值的属性叫实例属性,实例属性是该实例对象独有的,其他的对象获取不到
注意:同一类对象的不同实例对象所绑定的实例属性是相互独立的。也就是说,给一个实例对象所绑定的实例属性,对于另一个实例对象是不起作用的
类属性可以通过实例对象去获取,类属性也可以通过类直接去访问
实例属性:只能通过实例对象访问
__init__:为了对创建的实例对象进行初始化,即给实例对象一些属性
方法:定义在类中的函数 格式:def 方法名(self) def walk(self): self:代表的是实例对象
实例方法:
1.通过实例对象.方法名 man.walk()
2.通过类来调用实例方法:需要传入一个实例对象 。格式:类.方法(实例对象) Person.walk(man)
定义类方法:
@classmethod # 类方法装饰器,只允许使用类对象.方法() 的形式进行调用,不允许使用类对象实例的方式进行调用。
def func(cls):
print('这个是类方法')
class LoginTestCase(unittest.TestCase): """ 测试用例类必须继承于TestCase 测试登录功能函数的测试用例类 """ # setup 和 tearDown 方法放在最上方和最下方都无所谓 def setUp(self): # 用于测试用例执行前的初始化工作 print('用例{}要开始执行了'.format(self)) def tearDown(self): #用于测试用例执行之后的善后工作 print('用例{}执行结束了'.format(self)) """ @classmethod 定义的类方法是可选构造函数中, 我们定义了一个类方法,类方法的第一个参数(cls)指代的就是类本身。 类方法会用这个类来创建并返回最终的实例。 使用类方法的另一个好处就是在继承的时候 保证了子类使用可选构造函数构造出来的类是子类的实例而不是父类的实例 """ @classmethod def setUpClass(cls): time.sleep(2) print('测试用例类{}开始执行了'.format(cls)) @classmethod def tearDownClass(cls): time.sleep(3) print('测试用例类{}执行结束了'.format(cls))
self:在实例化时自动将对象/实例本身传给__init__的第一个参数,你也可以给他起个别的名字,但是正常人都不会这么做。
类有两种作用:属性引用和实例化
属性引用(类名.属性)
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意,这里不是在调用
实例化:类名加括号就是实例化,会自动触发__init__函数的运行,可以用它来为每个实例定制自己的特征
class Person: #定义一个人类 role = 'person' #人的角色属性都是人 def __init__(self,name): self.name = name # 每一个角色都有自己的昵称; def walk(self): #人都可以走路,也就是有一个走路方法 print("person is walking...") print(Person.role) #查看人的role属性 print(Person.walk) #引用人的走路方法,注意,这里不是在调用
实例化的过程就是类——>对象的过程
原本我们只有一个Person类,在这个过程中,产生了一个egg对象,有自己具体的名字、攻击力和生命值。
语法:对象名 = 类名(参数)
egg = Person('egon') #类名()就等于在执行Person.__init__() #执行完__init__()就会返回一个对象。这个对象类似一个字典,存着属于这个人本身的一些属性和方法。
查看属性&调用方法
print(man.name) #查看属性直接 对象名.属性名 print(man.walk()) #调用方法,对象名.方法名()
面向对象小结——定义及调用的固定模式
class 类名: def __init__(self,参数1,参数2): self.对象的属性1 = 参数1 self.对象的属性2 = 参数2 def 方法名(self):pass def 方法名2(self):pass 对象名 = 类名(1,2) #对象就是实例,代表一个具体的东西 #类名() : 类名+括号就是实例化一个类,相当于调用了__init__方法 #括号里传参数,参数不需要传self,其他与init中的形参一一对应 #结果返回一个对象 对象名.对象的属性1 #查看对象的属性,直接用 对象名.属性名 即可 对象名.方法名() #调用类中的方法,直接用 对象名.方法名() 即可
继承:
继承是一种创建新类的方式,在python中,新建的类可以继承一个或多个父类,父类又可称为基类或超类,新建的类称为派生类或子类。子类继承了父类的方法和属性
object:是python3中所有类的父类
python中类的继承分为:单继承和多
class ParentClass1: #定义父类 pass class ParentClass2: #定义父类 pass class SubClass1(ParentClass1): #单继承,基类是ParentClass1,派生类是SubClass pass class SubClass2(ParentClass1,ParentClass2): #python支持多继承,用逗号分隔开多个继承的类 pass
在子类中调用父类同名的方法:
1. 父类名.方法名(self)
2. super().方法名()
内置函数:
setattr:利用反射机制,动态设置属性
getattr:获取属性
delattr:删除属性
魔术方法:在python中用双下划线开头,双下划线结尾的方法叫魔术方法
魔术方法都是在特定情况下自动触发调用的,不需要手动去调用
__init__:创建对象的时候,自动调用
__setattr__: 该方法在对象设置属性的时候会被调用
__getattr__
__delattr__
魔术变量:在python中用双下划线开头,双下划线结尾的变量
__file__:代表当前文件的绝对路径
__name__:__main__
__main__:代表当前启动文件