1 对象
1.1 定义一个类
(对象 = 属性 + 方法)
class Turtle:
#属性
color = 'green'
weight = 10
legs = 4
shell = True
mouth = '大嘴'
#方法
def climb(self):
print("正在向前爬...")
def eat(self):
print("咬死你...")
def sleep(self):
print("睡了...")
对象实例化
>>> t = Turtle()
1.2 面向对象特征
封装
继承
>>> class Green_Turtle(Turtle):
pass
>>> first_green_turtle = Green_Turtle()
>>> first_green_turtle.sleep()
睡了...
2 面向对象编程
2.1 shelf
相当于C++当中的this指针
self 默认是一个参数
2.2 构造方法:
__init__(self,param1,param2...)
class Ball:
def __init__(self, name):
self.name = name
def kick(self):
print("我叫%s,有问题吗?" % self.name)
>>> b = Ball("DD")
>>> b.kick()
我叫DD,有问题吗?
2.3 共有 私有
在Python中定义私有变量只需要在变量名之前或函数名之前加上“__”两个下划线就可以。
定义了私有变量之后不可直接访问,但可以用对象方法的途径访问,或者用下划线方法访问。
①通过方法
>>> class Person:
__name = "徐文涛"
def getName(self):
return self.__name
>>> p = Person()
>>> p.__name
Traceback (most recent call last):
File "<pyshell#63>", line 1, in <module>
p.__name
AttributeError: 'Person' object has no attribute '__name'
>>> p.getName()
'徐文涛'
②通过下划线
>>> p._Person__name
'徐文涛'
3 继承
3.1 语法
class 子类(父类/基类):.......... |
3.2 注意:
子类如果重写了父类的方法 会把父类的方法覆盖掉
为了避免这种错误可以:
① 调用父类的方法
比如要重写__init__函数,在函数内部加入 父类的__init__方法
class Son(Father):
def __init__(self):
Father.__init__(self)
self.name = "比伯"
②super()方法
class Son(Father):
def __init__(self):
super().__init__()
self.name = "比伯"
3.3 多重继承
class DerviedClassName(Base1, Base2, Base3, ...):
pass
4 拾遗
组合:所谓的组合就是把一个类放在另一个类里面
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("水池中有%d只乌龟,%d只鱼" % (self.turtle.num, self.fish.num))
>>> pool = Pool(2,20)
>>> pool.print_num()
水池中有2只乌龟,20只鱼
5 类 类对象 实例对象
6 一些相关的BIF(内置函数)
①issubclass(class, classinfo)
如果第一个参数是第二个参数的子类 则返回True
注意:1 一个类会被认为是自身的子类
2 classinfo 可以是类对象组成的元组,只要class是其中任何一个类的子类,则返回True
②isinstance(object, classinfo)
判断一个实例对象是否是属于该类
注意:1 这里的classinfo也可以是一个元组
2 如果第一个参数不是对象,则永远返回False
3 如果第二个参数不是类 或者 类对象组成的元组,则会抛出TypeError异常
③hasattr(object, name)
测试这个对象是否有指定的属性
④getattr(object, name[, default])
返回对象指定的属性值,如果不存在 把default打印出来 否则抛出异常
⑤setattr(object, name, vlaue)
设置对象中指定属性的值,如果属性不存在,新建一个该属性
⑥deattr(object, name)
删除对象中指定的属性,如果属性不存在 抛出异常
⑦property(fget=None, fset=None, fdel=None, doc=None)
属性设置属性
举例:
class Person:
def __init__(self, name = 'Daly'):
self.name = name
def getName(self):
return self.name
def setName(self,name):
self.name = name
def delName(self):
del self.name
x = property(getName, setName, delName)
>>> p1 = Person()
>>> p1.x
'Daly'
>>> p1.x
'Daly'
>>> p1.x = 'DADA'
>>> p1.x
'DADA'
>>> p1.setName("hah")
>>>
>>> p1.x
'hah'
>>> del p1.x
>>> p1.x
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
p1.x
File "G:/python练习空间/对象/test2.py", line 6, in getName
return self.name
AttributeError: 'Person' object has no attribute 'name'
7 魔法方法
化腐朽为神奇,化干戈为玉帛 化不可能为可能,谈笑间强驽灰飞烟灭,大方无隅,大道无形,行者无疆,变大地位黄金。
7.1 构造和析构
①__init(self, ... )__
②__new__(class[,...])
这里留了疑问: 为什么直接return string 也可
>>> class CapStr(str):
def __new__(cls,string):
string = string.upper()
return str.__new__(cls,string)
>>> a = CapStr("xuwentao")
>>> a
'XUWENTAO'
③__del__(self)