python之面向对象方法详解
1.类变量与实例变量
类变量:可在类的所有实例之间共享的值(也就是说,它们不是单独分配给每个实例的)。
实例变量:实例化之后,每个实例单独拥有的变量。
#Author:Anliu class Role(object): n = 123 #类变量 def __init__(self,name,mail,TEL,address): #构造函数 #在实例化是做一些类的初始化工作 self.name = name # r1.name = name 实例变量(静态属性),作用域就是实例本身 self.mail = mail self.TEL = TEL self.address = address def buy_goods(self,goods): #类的方法,功能,(动态属性) print("%s正在买%s"%(self.name,goods)) def scan_goods(self): print("正在看") def mody_goods(self): print("正在改") r1 = Role("admin","123@163.com","183999999999","陕西陕西安市") #把一个类变成具体对象的过程叫 实例化,(初始换一个类,造了一个对象) r2 = Role("user","123@163.com","183999999999","陕西陕西安市") r1.buy_goods("pingguo") print(r1.n) #类变量不通过初始化即可调运;存在于类的内存中。 r1.n = "888" #修改了类变量,r1发生了修改,r2没有变化,这是因为此时的修改发生在实例的内存空间 print(r1.n) print(r2.n) Role.n = "666" #修改了类变量,r1任然是“888”,而r2是修改后的值,这是因为在实例的内存空间修改的值与在类的空间中修改的值本质上没有关系。 #对于实例化后的对象,实例变量优先级高于类变量。 print(r1.n,r2.n)
类变量和实例变量的区别在于:类变量是所有对象共有,其中一个对象将它值改变,其他对象得到的就是改变后的结果;而实例变量则属对象私有,某一个对象将其值改变,不影响其他对象
2.构造函数
构造函数也被称为构造器,当创建对象的时候第一个被自动调用的函数,系统默认提供了一个无参的构造函数 per = Person()
语法:
def __ init__(self,arg1,arg2,...):
函数体
当没有定义构造函数时,系统默认提供一个无参的构造函数。
arg1,arg2,...可以自己定义,但是,一般情况下,构造函数的形参列表和成员变量有关
构造函数的特点:(1)创建对象;(2)给对象的成员变量赋值
构造函数和成员函数之间的区别:
(1)成员函数的函数名可以自定义,但是,构造函数的函数名是固定的__init__
(2)成员函数需要被手动调用,但是,构造函数在创建对象的过程中是自动被调用的
(3)于同一个对象而言,成员函数可以被调用多次,但是,构造函数只能被调用一次
构造函数的作用:在实例化时做一些类的初始化工作。
3.析构函数
在实例释放,销毁的时候自动执行,常用于一些收尾工作,比如关闭数据库链接,清理临时文件等。
语法:
def __del__(self):
函数体
析构函数不能传参,是类的内部调运;在对象执行结束,内存被释放,销毁时执行;
实例del后将处罚运行。
3.私有方法
Python默认的成员函数和成员变量都是公开的,python的私有属性和方法没有类似别的语言的public,private等关键词来修饰。 在python中定义私有变量只需要在变量名或函数名前加上 "__"两个下划线,那么这个函数或变量就会为私有的了。
声明该方法为私有方法,不能在类的外部调用。
实例:
#Author:Anliu class test1: def ssh_test(self): print("测试ssh链接是否正常") def ssh_conn(self): print("ssh链接设备") admin = test1() user1 = test1() admin.ssh_test() user1.ssh_test()
假设开发需求规定对与实例不能直接使用ssh_test()的成员函数,ssh_test()的存在只是类的内部判断,在ssh_conn()之前调运ssh_test()测试可链接,则调运ssh_conn()。
那么,可将ssh_conn()设置为私有方法:
#Author:Anliu class test1: def __ssh_test(self): pass print("%s测试ssh链接是否正常"%self) flag = 1 return flag def ssh_conn(self): self.__ssh_test() #在类的内部可调运私有方法 print("ssh链接设备") #t = admin.__ssh_test() admin = test1() user1 = test1() #admin.__ssh_test() #将报错:AttributeError: 'test1' object has no attribute '__ssh_test' #user1.__ssh_test() user1.ssh_conn()
4.私有属性
如果有一个对象,当需要对其进行修改属性时,有2种方法
对象名.属性名 = 数据 ---->直接修改
对象名.方法名() ---->间接修改
为了更好的保存属性安全,即不能随意修改,一般的处理方式为
将属性定义为私有属性
添加一个可以调用的方法,供调用。
#Author:Anliu class user: def __init__(self,name,money,balance): self.name = name self.__money = money #定义私有属性 self.balance = balance def loggin(self): print("%s please logging,balance is %s,money is %s"%(self.name,self.balance,self.__money)) def buy(self): print("%s buy a shopping"%self.name) def skan(self): print("%s skan shopping"%self.name) def define(self,new_money): self.__money = new_money user_admin = user("admin","1223","32324") user_users = user("user","1223","32324") user_admin.loggin() user_users.buy() #print(user_users.__money) #报错:AttributeError: 'user' object has no attribute '__money' print(user_users.balance) print(user_users.define(100000)) #可调运新的新的方法来实现私有变量的修改