一、定义
类是现实世界或思维世界中的实体在计算机中的反映,它将数据以及这些数据上的操作封装在一起。对象是具有类类型的变量。
类是抽象的,而对象是类的实例。换句话说,类主要定义对象的结构,然后我们以类为模板创建对象。类不但包含方法定义,而且还包含所有实例共享的数据。
同一个类可以生成无数个对象,对象 = 属性(特征) + 方法(行为)。如:
类是股票(概念),对象是某一只股票;
股票的属性:市值、成交量、价格;
股票的方法:获取股票市值、计算成交金额等。
在Python中,可以使用关键字class定义 Python 类,关键字后面紧跟类的名称、分号和类的实现。通常的命名方式类名用大写
属性为名词
方法为动词
class StockA:
price=20
volume=10000
def calAmount(self):
return self.price*self.volume
# 实例化类对象
checkStockA = StockA()
checkStockA.calAmount()self:类中的方法必须包含参数self,且self需为第一个参数。在调用方法时,我们无需明确提供与参数self相对应的参数。
class stock:
def getToday(self,stockName, price, volume):
self.stockName=stockName
self.price = price
self.volume = volume
def calAmount(self):
return {self.stockName+'_Amount': self.price*self.volume}
# 实例化类创建类对象
stockBABA = stock()
stockBABA.getToday('BABA', 180, 30000)
print(stockBABA.calAmount())
# {'BABA_Amount': 5400000}__init__(前后各两个下划线):在类实例化时会自动调用
class stock:
def __init__(self,stockName, price, volume):
self.stockName=stockName
self.price = price
self.volume = volume
def calAmount(self):
return {self.stockName+'_Amount': self.price*self.volume}
stockBABA = stock('BABA', 180, 30000)
print(stockBABA.calAmount())
二、公有和私有私有变量
在 Python 中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了。私有变量一般不能被访问,但在Python中,可以通过_类名__变量名来访问,但建议不要这样做。
# 私有变量名
class stockBABA:
__name = 'BABA'
stockName = stockBABA()
stockName.__name
#'stockBABA' object has no attribute '__name'私有方法
class Site:
def __init__(self, name, url):
self.name = name # public
self.__url = url # private
def who(self):
print('name : ', self.name)
print('url : ', self.__url)
def __foo(self): # 私有方法
print('这是私有方法')
def foo(self): # 公共方法
print('这是公共方法')
self.__foo()
x = Site('baidu', 'www.baidu.com')
x.__foo()
# AttributeError: 'Site' object has no attribute '__foo'
三、类的继承
Python 同样支持类的继承,派生类的定义如下所示:
class DerivedClassName(BaseClassName):
statement-1
.
.
.
statement-N
BaseClassName(基类名)必须与派生类定义在一个作用域内。除了类,还可以用表达式,基类定义在另一个模块中时这一点非常有用:
class DerivedClassName(modname.BaseClassName):
statement-1
.
.
.
statement-N
如果子类中定义与父类同名的方法或属性,则会自动覆盖父类对应的方法或属性。
class Stock:
def __init__(self,stockName, price, volume):
self.stockName=stockName
self.price = price
self.volume = volume
def calAmount(self):
return {self.stockName+'_Amount': self.price*self.volume}
class BABA(Stock):
pass
class TENCENT(Stock):
pass
class BIDU(Stock):
pass
class BuyMaxAmount(Stock):
def __init__(self):
self.haveCapital = True
def buy(self):
if self.haveCapital:
print('I have cash to buy stock')
self.haveCapital = False
else:
print("I don't have any cash now")
BuyMaxAmount('TENCETN', 350, 20000).calAmount()
# TypeError: __init__() takes 1 positional argument but 4 were given
解决方法:使用super()函数
super 是用来解决多重继承问题的,直接用类名调用父类方法在使用单继承的时候没问题,但是如果使用多继承,会涉及到查找顺序(MRO)、重复调用(钻石继承)等种种问题。
class Stock:
def __init__(self,stockName, price, volume):
self.stockName=stockName
self.price = price
self.volume = volume
def calAmount(self):
return {self.stockName+'_Amount': self.price*self.volume}
class BABA(Stock):
pass
class BuyAmount(Stock):
def __init__(self, stockName, price, volume):
self.haveCapital = True
super().__init__(stockName, price, volume)
def buy(self):
if self.haveCapital:
print('I have cash to buy stocks')
self.haveCapital = False
else:
print("I don't have any cash now")
buyBABA = BuyAmount('BABA', 2500, 50000)
buyBABA.buy()
# I have cash to buy stocks
四、类的组合
class StockA:
def __init__(self,price):
self.price = price
class StockB:
def __init__(self, price):
self.price = price
class TwoStock:
def __init__(self, priceA, priceB):
self.stockA = StockA(priceA)
self.stockB = StockB(priceB)
def printStocks(self):
print('StockA $ %d , StockB $ %d '% (self.stockA.price, self.stockB.price))
twoStock = TwoStock(220, 350)
twoStock.printStocks()
# StockA $ 220 , StockB $ 350
五、相关内置函数issubclass(class, classinfo) 方法用于判断参数 class 是否是类型参数 classinfo 的子类。(一个类被认为是其自身的子类。)classinfo可以是类对象的元组,只要class是其中任何一个候选类的子类,则返回True。
isinstance(object, classinfo) 方法用于判断一个对象是否是一个已知的类型,类似type()。type()不会认为子类是一种父类类型,不考虑继承关系。
isinstance()会认为子类是一种父类类型,考虑继承关系。
如果第一个参数不是对象,则永远返回False。
如果第二个参数不是类或者由类对象组成的元组,会抛出一个TypeError异常。
hasattr(object, name)用于判断对象是否包含对应的属性。
getattr(object, name[, default])用于返回一个对象属性值。
setattr(object, name, value)对应函数 getattr(),用于设置属性值,该属性不一定是存在的。
delattr(object, name)用于删除属性。