三、属性和方法
•类由成员变量(对应于对象的属性)和成员函数(对应于对象的方法)组成。属性是对数据的封装,方法则表示对象具有的行为。
•Python的构造函数、析构函数、私有属性或方法都是通过名称约定区分的。
此外,Python还提供了一些有用的内置方法,简化了类的实现
1、类的成员属性
•Python的类的成员一般分为私有属性和公有属性,像C++有定义属性的关键字(public、private、protect),而Python没有这类关键字,默认情况下所有的属性都是“公有的”,对公有属性的访问没有任何限制,且都会被子类继承,也能从子类中进行访问。
•若不希望类中的成员在类外被直接访问,就要定义为私有属性。Python使用约定属性名称来划分属性类型。若属性的名字以两个下划线开始,表示私有属性;反之,没有使用双下划线开始的表示公有属性。类的成员变量及成员函数都同样使用这个约定。
•另外,Python没有保护类型的修饰符。
Python的实例变量和类变量:
•实例变量是以self为前缀的成员变量,没有该前缀的成员变量是普通的局部变量。
•C++中有一类特殊的属性称为静态变量。静态变量能被实例化对象调用,还可以被类直接调用。当创建新的实例化对象后,静态变量并不会获取新的内存空间,而是使用类创建的内存空间。因此,静态变量能够被多个实例化对象共享。
•在Python中静态变量称为类变量,类变量可以在该类的所有实例中被共享。
关于Python私有属性的访问:
•类的外部不能直接访问私有属性。
•Python提供了直接访问私有属性的方式,可用于程序的测试和调试。
•私有属性访问的格式:
instance._classname__attribute
•说明:
–instance表示实例化对象;
–classname表示类名;
–attibute表示私有属性
•注意:classname之前是单下划线,attribute之前是双下划线
class Fruit:
def __init__(self,color):
self.__color=color #定义私有变量;
if __name__=="__main__":
apple=Fruit('red') #创建实例对象
print(apple._Fruit__color) #调用类的私有变量;
输出结果:red
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
class Fruit(object):
price=0 #定义类类变量
def __init__(self,color):
self.__color=color #定义私有变量;
def getColor(self):
print(self.__color) #输出私有变量
@staticmethod #使用@staticmethod修饰器定义静态方法
def getPrice():
print(Fruit.price)
def __getPrice(): #定义私有方法
Fruit.price=Fruit.price+10
print(Fruit.price)
count=staticmethod(__getPrice) #使用staticmethod 方法定义静态方法
if __name__=="__main__":
apple=Fruit('red') #创建实例对象
apple.getPrice() #使用实例调用方法
Fruit.count() #使用类名调用静态方法
banana=Fruit('yellow')
Fruit.getPrice()
Fruit.count()
输出方法:
0
10
10
20
#构造函数应用一
class Person(object):
def __init__(self,name='',age=0):
self.name=name
self.age=age
def __str__(self):
return "Person('%s','%d')" % (self.name,self.age)
if __name__=="__main__":
p=Person('Jack',25)
print(p)
p=Person() #可以创建空对象
print(p)
输出结果为:
Person('Jack','25')
Person('','0')
#构造函数应用二
class Fruit(object):
def __init__(self,color):
self.__color=color
def getColor(self):
print(self.__color)
def setColor(self,color):
if color in ('red','black','white','gray','blue'):
self.__color=color
if __name__=="__main__":
color='red'
fruit=Fruit(color)
fruit.getColor()
fruit.setColor('blue')
fruit.getColor()
fruit.setColor('yellow')
fruit.getColor()
fruit.setColor('white')
fruit.getColor()
<