python class成员详解
一、类的成员--变量
在类中变量成员分为两类:实例变量(字段)和类变量(静态变量)
(1)实例变量:每一个实例都应该拥有自己的变量,实例变量是给对象用的。
(2)类变量:类变量是属于类的,只有通过类名调用才能更改类变量的值。
class Person: coutry="中国" #在此处申明类变量 def __init__(self,name ,age): #构造方法,在此处声明实例化变量 self.name=name #实例变量 self.age=age # Person.coutry="大庆" #通过类 修改类变量 mt=Person("马化腾",18) mt.company="腾讯" #添加实例变量 mt.coutry="大庆" #即使类变量中存在country,对象不能直接对类变量修改,只会在自己对象中添加实例化变量 print(mt.age) #18 print(mt.company)#腾旭 print(mt.coutry) #对象.变量 :寻找的方法,首先现在对象的属性中寻找,如果找到直接,停止寻找,并返回,否则继续向类变量寻找 al=Person("曹操",135) print(al.age) #135 print(al.coutry)#中国 # 类变量的修改只能通过类修改
二、类的成员---方法
1、成员方法(实例方法)
lass Cat: def chi(self): print("猫喜欢吃鱼") c=Cat() c.chi()#猫喜欢吃鱼
2、静态方法:类里面定义一个普通的函数(与外部函数一样)
格式:@staticmethod +函数定义的方法
ss Static( ): @staticmethod def chi():#静态方法,不需要传递self参数,与普通函数一样 print("我是一个静态的吃吃") s=Static() s.chi() #我是一个静态的吃吃
3、类方法:不管是对象还是类访问该方法,接受到的值都是类
格式:@classmethod +函数定义的方法(cls)
class Class(): @classmethod def say(cls):#第一个位置自动产生一个cls,接受一个类 print(cls) print("我是类方法,我接受的值是类") c=Class() c.say() #<class '__main__.Class'> 我是类方法,我接受的值是类 Class.say() #<class '__main__.Class'> 我是类方法,我接受的值是类
⾯试题: 类⽅法/静态⽅法和实例⽅法有什么区别?
类方法:一般只由类调用,不推荐用实例调用,有默认传递的参数cls,默认传递的参数是类;
实例方法:实例方法由实例对象调用,有默认传递的参数self,默认参数是对象本身;
静态方法:可以由类和实例对象调用,没有默认参数
三、类的成员--属性
属性一般在__init__(self)中创建,但是有时候我们的属性需要计算,这个时候属性就不能直接在___init__中声明,此实需要利用函数的属性化。
函数属性化:把公式转换为属性
格式:@property +函数定义的方法
etime #插入时间模块 class Person: def __init__(self,name,birthday,email): self.name=name self.birthday=birthday self.email=email # 要求需要定义一个age属性 @property #把方法转换为属性,对象属性的书写,self.age def age(self): #方法中只有一个参数self now_time = int(datetime.datetime.now().strftime("%Y"))#获取当前的年的数值:2018 return now_time-int(self.birthday.strip().split("-")[0]) #2018-1014 c=Person("小鸡","2014-10-15","123a46@qq.com") print(c.age) #c.age 得到年龄属性 结果:4
总结;
1、方法参数只有一个self;
2、方法中需要书写@property;
3、调用的时候,不需要带括号,直接当成对象的属性变量来用就可以;
4、这种套路只能取值,不能设置值。
四、私有
私有方法的表示方法:__方法 、__变量、__类
在python中使用__作为方法或者变量的前缀,那么这个方法或者变量就i是一个私有的。
1、私有变量
Person:
def __init__(self,name,laopo,):
self.name=name
self.__laopo=laopo#私有变量,老婆是自己的别人不能用
def look(self):
print(self.__laopo)
r=Person("周杰伦","昆仑")
r.look() #通过内部函数访问 昆仑
print(r.__laopo)#type object 'Person' has no attribute '__laopo'
2、私有方法
class Yue: def __yue(self): print("我要出去约约约") def chi(self): print("吃什么") def __play(self): print("玩什么") r=Yue() r.chi() r.__yue() #'Yue' object has no attribute '__yue' 报错 r.__play #'Yue' object has no attribute '__play' 报错
3、私有类和私有静态方法不再赘述了,与私有的其他的方法一样
总结:
1、私有方法不能被外部访问,只能通过内部访问;
2、无法被继承。