class C:
num = 0
def __init__(self):
self.x = 4
self.y = 5
C.count = 6
class C:
num = 0 #类属性
def __init__(self):
self.x = 4 #实例属性
self.y = 5 #实例属性
C.count = 6 #类属性
类属性和实例属性区别
在 Python 中定义私有变量只需要在变量名或函数名前加上“__”两个下划线,那么这个函数或变量就会为私有的了。
class JustCounter:
__secretCount = 0 # 私有变量
publicCount = 0 # 公开变量
def count(self):
self.__secretCount += 1
self.publicCount += 1
print(self.__secretCount)
counter = JustCounter()
counter.count() # 1
counter.count() # 2
print(counter.publicCount) # 2
print(counter._JustCounter__secretCount) # 2 Python的私有为伪私有
print(counter.__secretCount)
# AttributeError: 'JustCounter' object has no attribute '__secretCount'
class C:
def myFun():
print('Hello!')
c = C()
c.myFun()
#TypeError: myFun() takes 0 positional arguments but 1 was given
class C:
def myFun(self):
print('Hello!')
c = C()
c.myFun()
#Hello!
要求:
平日票价100元
周末票价为平日的120%
儿童票半价
class Ticket():
def __init__(self, adult_num, kid_num, day):
# day-输入1~7表示星期一~星期天
self.adult_num = adult_num
self.kid_num = kid_num
self.day = day
self.price = 100
def sum_price(self):
if self.day in range(1,6):
# 星期一到星期五
print("总票价为: %d 元" %(self.price * (self.adult_num+self.kid_num/2)))
else:
# 周末
print("总票价为: %d 元" %(self.price*1.2 * (self.adult_num+self.kid_num/2)))
p = Ticket(3, 1, 5)
p.sum_price()
# 总票价为: 350 元
魔法方法总是被双下划线包围,例如__init__。
魔法方法是面向对象的 Python 的一切。
魔法方法的“魔力”体现在它们总能够在适当的时候被自动调用。
魔法方法的第一个参数应为cls(类方法) 或者self(实例方法)。
class Rectangle:
def __init__(self, x, y):
self.x = x
self.y = y
def getPeri(self):
return (self.x + self.y) * 2
def getArea(self):
return self.x * self.y
rect = Rectangle(4, 5)
print(rect.getPeri()) # 18
print(rect.getArea()) # 20
__ new__至少要有一个参数cls,代表要实例化的类,此参数在实例化时由 Python 解释器自动提供,后面的参数直接传递给__init__。
__ new__对当前类进行了实例化,并将实例返回,传给__init__的self。但是,执行了__new__,并不一定会进入__init__,只有__new__返回了,当前类cls的实例,当前类的__init__才会进入。
要求:
import time
class Mytime(object):
def __init__(self):
self.__info = '未开始计时!'
self.__begin = None
self.__end = None
self.__jg = 0
def __str__(self):
return self.__info
def __repr__(self):
return self.__info
def start(self):
print('计时开始...')
self.__begin = time.localtime()
def stop(self):
if not self.__begin:
print('提示:请先调用start()开始计时!')
return
self.__end = time.localtime()
self.__jg = time.mktime(self.__end) - time.mktime(self.__begin)
self.__info = '共运行了%d秒' % self.__jg
print('计时结束!')
return self.__jg
def __add__(self, other):
return '共运行了%d秒' % (other.__jg + self.__jg)
t1 = Mytime()
print(t1)
# 未开始计时!
t1.stop()
# 提示:请先调用start()开始计时!
t1.start()
# 计时开始...
time.sleep(5)
t1.stop()
# 计时结束!
print(t1)
# 共运行了5秒
t2 = Mytime()
t2.start()
# 计时开始...
time.sleep(7)
t2.stop()
# 计时结束!
print(t2)
# 共运行了7秒
print(t1 + t2)
# 共运行了12秒