Python学习六(类的定义和使用)
一、类的定义和使用#!/usr/bin/python#coding=utf-8#定义类class Stock:def __init__(self, stockCode, price):self.stockCode, self.price = stockCode, pricedef get_stockCode(self):return self.stockCodedef set_stockCode(
·
一、类的定义和使用
#!/usr/bin/python
#coding=utf-8
#定义类
class Stock:
def __init__(self, stockCode, price):
self.stockCode, self.price = stockCode, price
def get_stockCode(self):
return self.stockCode
def set_stockCode(self, stockCode):
self.stockCode = stockCode
def get_price(self):
return self.price
def set_price(self, price):
self.price = price
def display(self):
print("Stock code is:{}, price is{}.".format(self.stockCode, self.price))
#使用类
myStock = Stock("12580", 100)
myStock.display()
myStock.set_stockCode("123456")
print(myStock.get_stockCode())
myStock.set_price(200)
print(myStock.get_price())
笔记:
1、self是指自身类,这里即是指Stock类,比如在上面的init方法中,是用self.stockCode, self.price=stockCode, price的方法,用参数传入的stockCode和price给类的对应属性赋值。
测试运行:
二、魔术方法
在开头和结尾都是两个下划线的方法叫做魔术方法,它们会在特定的时间点被自动触发。
#!/usr/bin/python
#coding=utf-8
#定义类
class Stock:
def __init__(self, stockCode):
print("__init__")
self.stockCode = stockCode
#回收类的时候被触发
def __del__(self):
print("__del__")
def __str__(self):
print("__str__")
return "stockCode is: " + self.stockCode
def __repr__(self):
print("__repr__")
return "##stockCode is: " + self.stockCode
def __setattr__(self, name, Value):
print("__setattr__")
self.__dict__[name] = Value #给类中的属性名分配值
def __getattr__(self, key):
print("__getattr__")
if key == "stockCode":
return self.stockCode
else:
print("Class has no attribute '%s'" % key)
myStock = Stock("12580") #触发__init__和__setattr__方法
print(myStock) #触发__str__方法
myStock.stockCode = "123456" #触发__setattr__方法
笔记:
1、__del__方法有点像析构函数,在类被回收时触发。
2、__str__和__repr__方法一般会配套使用。上面代码中 ***print(myStock)*** 会调用__str__方法,如果注释掉__str__方法,则会调用__repr__方法(这是本人亲测的效果,但本人手中的书写——如果不写__str__方法,运行时会报错。望大神能解惑下)。
3、__setattr__和__getattr__方法分别会在设置和获取属性时被触发。
测试运行:
三、对外屏蔽类中的不可见方法
#!/usr/bin/python
#coding=utf-8
#定义类
class Car:
def __init__(self, owner, area):
self.owner = owner
self.__area = area
def __engineStart(self):
print("Engine Start")
def start(self):
print("Start Car")
self.__engineStart()
def get_area(self):
return self.__area
def set_area(self, area):
self.__area = area
myCar = Car("Nichlas", "shenzhen")
print(myCar.owner)
print(myCar.get_area())
myCar.set_area("zhanjiang")
print(myCar.get_area())
print(myCar.start())
笔记:
1、像_xx这样以单下划线开头的是protected类型的变量和方法;像__xx这样以双下划线表示的是private类型的变量和方法。它们都只能在本类中被调用。
测试运行:
四、类方法和静态方法
#!/usr/bin/python
#coding=utf-8
#定义类
class CalculateTool:
__PI = 3.14
@staticmethod
def add(x, y):
__result = x + y
print(x + y)
@classmethod
def calCircle(self, r):
print(self.__PI * r * r)
CalculateTool.add(20, 30)
CalculateTool.calCircle(1)
#不建议通过对象访问类方法和静态方法
tool = CalculateTool()
tool.add(10, 20)
tool.calCircle(2)
笔记:
1、不需要实例化对象就可以初始化类方法和静态方法。
2、类方法的第一个参数必须是指向本身的引用,而静态方法可以没有任何参数。
3、上面代码中**add**方法前加了**@staticmethod**注解,用来说明这个方法是静态方法;**calCircle**方法前加**@classmethod**注解,说明这个方法是类方法。
4、静态方法和类方法会破坏类的封装性,使用时需谨慎。
测试运行:
更多推荐
已为社区贡献2条内容
所有评论(0)