类与方法
一. 对象 = 属性 + 方法
二.Self
三.Python 的魔法方法
四.公有和私有
五.继承
六.组合
七. 类、类对象和实例对象
八.绑定
九.一些相关的内置函数
十.习题
十一.总结
一.对象 = 属性 + 方法
1.1 什么是类
对象是类的实例。类里面包含定义的方法,还有所有实例共享的数据,因此可以以类为模板创造示例。
class Turtle: # Python中的类名约定以大写字母开头
"""关于类的一个简单例子"""
color = 'green' #类变量
def __init__(self,name): #定义一个初始化函数
self.name=name #self.name是实例变量,只有在函数初始化的时候才有意义
# 方法
def climb(self,m):
print('我努力地爬了%s米' %m)
a = Turtle('A') #用类创造一哥name为A的实例a
b = Turtle('B') #用类创造一哥name为B的实例b
print(a.name) #A 实例变量
print(b.name) #B 实例变量
print(a.color) #green 类变量
print(b.color) #green 类变量
a.climb(1) #我努力地爬了1米
b.climb(2) #我努力地爬了2米
上述例子中color为类变量,climb中的name为实例变量。用类创造出的变量a和b具有类的属性和方法,
可以看出,他们的类变量相同,可调用的方法也一样。
1.2 继承
子类可以继承父类的方法和变量。 在下面的例子中,Child为Father的子类,可以看出虽然a是由Child创造的,但它依然可以使用Father的变量和方法。
class Father:
'''父类'''
color='green'
def climb(self,m):
print('我努力地爬了%s米' %m)
class Child(Father):
'''子类'''
def walk(self,n):
print('我轻松地走了%s米' %n)
a=Child()
a.walk(10) #我轻松地走了10米
a.climb(1) #我努力地爬了1米
print(a.color) #green
1.3多态
让具有不同功能的函数可以使用相同的函数名,使他们可以通过同一个函数名来调用。
class People(object):
def run(self):
print('人正在走')
class Pig(object):
def run(self):
print('猪正在走')
class Dog(object):
def run(self):
print('狗正在跑')
'''以上三个是不同名字的函数,多态可以使用同一个函数名来调用他们'''
def func(object): #定义一个
object.run()
func(People()) #人正在走
func(Pig()) #猪正在走
func(Dog()) #狗正在跑
上面的例子中,定义了三个继承object的子类,然后可以使用func来调用他们。
二.Self
Self是什么?
python中的self相当于JavaScript里的this指针,指向当前实例对象。函数的第一个参数,就必须是实例对象本身,即self。
class Person:
def __init__(self,name):
self.name=name #self的对象为who
def who(self):
print('我是%s'%self.name)
a=Person('小王') #传入参数 小王
a.who() #我是小王
这个例子是我编的,往下看的时候发现和下面的例子几乎一致,夸一下自己哈哈哈。
三.Python 的魔法方法
魔法方法是一种可以自动触发的方法,在类中主要用到的是__init__(self[, ...])
,在实例化的时候回自动调用。
还用刚才的例子来说明。
class Person:
def __init__(self,name):
self.name=name #self的对象为who
def who(self):
print('我是%s'%self.name)
a=Person('小王') #在Person实例化的时候,就会自动触发__init__
a.who() #我是小王
后面一个章节会介绍更多Python中魔法方法的用法,这里就先写到这。
四.公有和私有
我对共有和私有的理解是:直接使用类的时候都可以用;当把类实例化时,实例对象则不能使用类中的私有变量或方法。
类的私有属性实例
class Person:
height='180cm'
__weight='75kg'
a=Person() #将Person实例化
print(a.height) #180cm
print(a.__weight) #__weight是类的私有变量,a是无法使用的
#AttributeError: 'Person' object has no attribute '__weight'
类的私有方法实例
class Person:
def __init__(self,name):
self.name=name #self的对象为who
def who(self):
print('我是%s'%self.name)
def where(self):
print('现在在广州')
def __where(self):
print('现在在广州')
a=Person('小王') #在Person实例化的时候,就会自动触发__init__
a.who() #我是小王
a.where() #现在在广州
a.__where()
#AttributeError: 'Person' object has no attribute '__from'
五.继承
在1.2中介绍了一部分继承的性质,这里补充一下。子类可以继承父类的方法,但是当子类构建了一个新的方法名与父类的方法名相同时,就会将从父类那继承的方法名覆盖。
六.组合
可以把多个类写到一个类里面,这个类里变量是多个类的子类。
class Turtle:
def __init__(self, x):
self.num = x
class Fish:
def __init__(self, x):
self.num = x
class Pool:
def __init__(self, x, y):
self.turtle = Turtle(x)
self.fish = Fish(y)
def print_num(self):
print("水池里面有乌龟%s只,小鱼%s条" % (self.turtle.num, self.fish.num))
p = Pool(2, 3)
p.print_num()
# 水池里面有乌龟2只,小鱼3条
七. 类、类对象和实例对象
python中万物皆对象,我对类的理解是,在内存里开辟一个空间,在里面存放类自己的东西。object是最大的类,包含一切,默认情况下不写。在类中定义的变量被称为类对象,把类实例化之后就会被称为实例对象。
class Person: #类名
a=1 #类对象
def who(self,name):
print('我是%s'%self.name)
b=Person() #实例对象
八.什么是绑定?
Python 严格要求方法需要有实例才能被调用,这种限制其实就是 Python 所谓的绑定概念。
Python 对象的数据属性通常存储在名为.__ dict__
的字典中,我们可以直接访问__dict__
,或利用 Python 的内置函数vars()
获取.__ dict__
。
class CC:
def setXY(self, x, y):
self.x = x
self.y = y
def printXY(self):
print(self.x, self.y)
dd = CC()
print(dd.__dict__)
# {}
print(vars(dd))
# {}
print(CC.__dict__)
# {'__module__': '__main__', 'setXY': <function CC.setXY at 0x000000C3473DA048>, 'printXY': <function CC.printXY at 0x000000C3473C4F28>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}
dd.setXY(4, 5)
print(dd.__dict__)
# {'x': 4, 'y': 5}
print(vars(CC))
# {'__module__': '__main__', 'setXY': <function CC.setXY at 0x000000632CA9B048>, 'printXY': <function CC.printXY at 0x000000632CA83048>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}
print(CC.__dict__)
# {'__module__': '__main__', 'setXY': <function CC.setXY at 0x000000632CA9B048>, 'printXY': <function CC.printXY at 0x000000632CA83048>, '__dict__': <attribute '__dict__' of 'CC' objects>, '__weakref__': <attribute '__weakref__' of 'CC' objects>, '__doc__': None}
九.一些相关的内置函数
-
issubclass(class, classinfo)
方法用于判断参数 class 是否是类型参数 classinfo 的子类。 -
isinstance(object, classinfo)
方法用于判断一个对象是否是一个已知的类型,类似type()
。 -
type()
不会认为子类是一种父类类型,不考虑继承关系。 -
isinstance()
会认为子类是一种父类类型,考虑继承关系。 -
如果第一个参数不是对象,则永远返回
False
。 -
如果第二个参数不是类或者由类对象组成的元组,会抛出一个
TypeError
异常。 -
hasattr(object, name)
用于判断对象是否包含对应的属性。 -
getattr(object, name[, default])
用于返回一个对象属性值。 -
setattr(object, name, value)
对应函数getattr()
,用于设置属性值,该属性不一定是存在的。 -
delattr(object, name)
用于删除属性。 -
class property([fget[, fset[, fdel[, doc]]]])
用于在新式类中返回属性值。 -
fget
– 获取属性值的函数 -
fset
– 设置属性值的函数 -
fdel
– 删除属性值函数
十.习题
1、以下类定义中哪些是类属性,哪些是实例属性?
class C:
num = 0
def __init__(self):
self.x = 4
self.y = 5
C.count = 6
答:C、num是类属性;self.x、self.y和C.count是实例属性。
2、怎么定义私有⽅法?
在方法名前面加两个下划线“__”。
3、尝试执行以下代码,并解释错误原因:
class C:
def myFun():
print('Hello!')
c = C()
c.myFun()
原因是C()在C这个类里没有定义,如果把c=C()和c.myFun()去掉首行缩进,写到C类外面的话,就可以正常运行了。这样是因为他们都同属于一个Object类里。
4、按照以下要求定义一个游乐园门票的类,并尝试计算2个成人+1个小孩平日票价。
要求:
- 平日票价100元
- 周末票价为平日的120%
- 儿童票半价
class Ticket():
money=100
childMoney=int(0.5*money)
day=int(input('今天是周:'))
adult=int(input('大人多少个:'))
child=int(input('孩子多少个:'))
if day<6:
ticket=money*adult+child*childMoney
print(ticket)
elif 5<day<8:
money=120
ticket=money*adult+child*childMoney
print(ticket)
------------------------------------------------------
今天是周:1
大人多少个:2
孩子多少个:1
250
十一.总结
这次的知识点基本上都是用自己的语言表述出来的,举的例子大多也都是自己写的。gogogo