成员
1.类的成员:在类中所写的内容就是成员。
class 类名:
def __init__(self,参数1,参数2...):
# 属性变量
self.属性1 = 参数1
self.属性2 = 参数2
# 方法
def method(self):
pass
# 在上述代码中__init__和method都属于类的成员方法,又称为实例方法。它需要对象来访问,
而上方的self.属性1 = 参数1这个代码的含义是给对象设置属性信息。涵义是这个对象的xxx属性是xxx,
这被称为成员变量或者实例变量再或者被称为字段。
2.类的成员-变量
在类中变量分为两大类:
1.实例变量(字段):每个实例对象拥有的变量。
2.类变量(静态变量):一类事物统一拥有的变量。
#例:
class Person:
# 类变量表示此类中所有的对象都共享这个变量
country = '中国'
def __init__(self,name,num,birthday):
self.name = name
self.num = num
self.birthday = dirthday
p1 = Person('alex',20,'1990年09月26日')
print(p1.name) # alex
print(p1.country) # 中国
p2 = Person('wusir',19,'1991年08月25日')
print(p2.name) # wusir
print(p2.country) #中国
# 类中的变量是共用的,如果类中变种变量发生改变,其他对象共用的这个变量时也会发生改变。如果某个对象在自身定义
一个和类中属性相同的变量,其自身这个变量将会给变,不会影响类中变量也不会影响其他对象使用类中变量。
例:
P1 = Person('alex',20,'1990年09月26日')
p1.country = '移民'
print(p1.name) # alex
print(p1.country) # 移民
p2 = Person('wusir',19,'1991年08月25日')
print(p2.name) # wusir
print(p2.country) #中国
# 类变量,最好是用类名来访问,通过对象名也可以访问但是只能看,不能改变。想要改变只能通过类名来改变。
例:
class Foo:
count = 0
def __init__(self):
Foo.count += 1
print(Foo.count) # 0
Foo()
Foo()
Foo()
print(Foo.count) # 3
总结:
实例变量:给对象用的。
类变量:多个对象共享的,最好是用类名来访问(规范)
3.类的成员-方法
1.成员方法(实例方法):对象直接访问的方法叫成员方法。
例:
class Computer:
# 实例方法(成员方法)
def play(self):
print('我的电脑')
c = Computer()
c.play() # 对象直接去掉用实例方法
2.静态方法:静态方法不需要传递self,如果出现一个方法不需要使用成员变量,就可以选择静态方法,
静态方法需要在我们的方法上加@staticmethod
例:
@staticmethod
def fare():
print('我的电脑很厉害,可以飞')
Computer.fare() # 类名可以直接访问
c.fare() # 对象也可以访问,但最好不要这样使用,以便区分静态方法和实例方法
3.类方法:类方法需要在参数列表的第一个位置预留一个位置,通常我们给第一个位置起名叫cls。类方法在被调用的时候不需
传递实例对象,系统会自动的把,类传递给第一个参数,类方法在编写的时候,需要在类方法上添加@classmethod
例:
class Computer:
def play(self):
print('我的电脑可以玩')
@staticmethod
def fare():
print('我的电脑很厉害,可以飞')
@classmethod
def cal(cls,a,b):
print(cls)
return a+b
print(Computer.cal(1,2)) # 此时会自动的把类名传递给类方法的第一个参数
4.类的成员-属性
属性:属性其实就是通过方法改造过来的一种变量的写法,在方法上面添加一个@propety。
例:
class Person:
def __init__(self):
pass
@properety
def age(self):
return 1
p = Person()
age = p.age
print(age)
# 应用场景:我们一般在保存数据的时候,不会保存一个人的年龄,因为随着时间的推移,每个人的年龄都在不停的增长。
如何保存年龄?保存出生年月日,然后用程序来计算,你当前的年龄,实时的时间。这个时候就需要进行计算了,
计算相当于一个功能,需要写到方法里,但是对于年龄这个属性语言,它应该是一个数值,而不是动作。所以python提供了
这样的机制,通过方法来描述一个属性。
注:
1.方法参数只能有一个self
2.方法上方要写@property
3.调用的时候,我们不需要写括号,直接当成属性变量来用
4.这种套路只能取值,不能设置值
5.私有
在python中,一般是不提倡设置和使用私有信息的。但是有些场景就需要一些内容不公开。所以在python中使用__作为方法
或者变量的前缀,这样这个方法或者变量就比变成了一个私有的。
1.私有变量:自己设置,只能自己访问的变量
例:
class Person:
def __init__(self,laopo,mimi):
self.__laopo = laopo #__表示数据信息私有
self.__mimi = mimi
alex = Person('老婆','乡下还有个相好的')
print(alex.__mimi) # 私有信息,不会被执行打印
报错:AttributeError: 'Person' object has no attribute '__mimi'
私有的内容不会被访问到,但在他自己内部可以随意使用
例:
class Person:
def __init__(self,laopo,mimi):
self.__laopo = laopo
self.__mimi = mimi
def gaosuni(self):
print('被发现了,公诸于世')
return self.__mimi # 私有内容在自己内部可随意使用
alex = Person('老婆','乡下还有个相好的')
mimi = alex.gaosuni() # 通过非私有的方法,访问到他的秘密
print(mimi)
注:私有的内容不能直接访问. 但是如果对方开辟了外界访问的通道(公共方法).
那可以通过这个公共的方法来获取到私有的内容. 这样做的好处是. 外界, 只能看,
但是改不了.不单单实例变量有私有的. 类变量(静态变量)一样拥有这样的属性。
例:
class Person:
__yuwang = '人的欲望' # 内心深处的欲望,不能让任何人知道
def __init__(self,laopo,mimi):
self.__laopo = laopo
self.__mimi = mimi
def gaosuni(self):
print('被发现了,公诸于世')
return self.__mimi
alex = Person('老婆','乡下还有个相好的')
mimi = alex.gaosuni()
print(mimi)
print(Person.__yuwang) # 不能访问,会报错
报错: AttributeError: type object 'Person' has no attribute '__yuwang'
2. 私有方法:只能自己访问的方法,别人不能访问
例:
class Person:
def __init__(self):
pass
def __yue(self):
print('我要约姑娘')
def job(self):
print('努力工作')
p = Person()
p.__yue() # 不能执行访问,会报错
报错:AttributeError: 'Person' object has no attribute '__yue'
注:__yue是一个私有方法,只能在类中自己调用,在类外面不能访问
job是一个成员方法,并且是一个开放的方法,在类的外界可以被访问到
类中的私有方法也是相对而言的,我们可以通过其他的方法来访问到。
例:
class Person:
def __init__(self):
pass
def __yue(self):
print('我要约姑娘')
def job(self):
print('努力工作')
self.__yue() # 在自己的类中访问自己的其方法,私有的自己也可以用
p = Person()
p.job()
注:对于私有的内容而言,子类是无法继承的
例:
class Fu:
__mimi = '乡下有个相好的'
class Zi(Fu):
pass
print(Zi.__mimi) # 子类不能继承父类私有内容,会报错
报错:AttributeError: type object 'Zi' has no attribute '__mimi'