1 类与对象
1.1 类的定义
class Turtle:#Python 中的类名约定以大写字母开头
'''关于类的一个简单例子…'''
#属性
color='green'
weight=10
legs=4
shell=True
mouth='大嘴'
#方法
def climb(self):
print("我正在很努力的向前爬...")
def run(self):
print("我正在飞快的向前跑...")
def bite(self):
print("咬死你咬死你!!")
def eat(self):
print("有得吃,真满足_A")
def sleep(self):
print("困了,睡了,晚安,Zzzz")
1.2 对象操作
tt = Turtle()
tt.climb()
同C++的static,python的类可以通过类名直接调用方法。
1.3 公有和私有
python中没有C++的public和private关键字,但并不意味着Python的所有属性都是公有的。
name mangling(名字改编,名字重整):在Python中定义私有变量只需要在变量名或函数名前加上“两个下划线 __
”,那么这个函数或变量就会为私有的了。
要查看私有变量,要通过定义get函数
class Person:
__name="whx"
def getName(self):
return self.name
p = Person()
p.__name #报错,无法访问private变量
p.getName() #成功
1.4 self
Python的 self
相当于C++的 this
指针.
不同于C++,self在函数的定义时必须要写在括号里,调用时省去。
2 面向对象
2.1 封装
做到信息屏蔽,成为一个独立的模块。
2.1 继承
同C++,子类可以享用父类的公有方法。
继承格式不同于C++,采用子类(父类)
的形式class DerivedClassName(BaseClassName):
class MyList(list):
pass
pass
:Python pass 是空语句,是为了保持程序结构的完整性。pass 不做任何事情,一般用做占位语句。
如果子类中定义与父类同名的方法或属性(重写),则会自动覆盖父类对应的方法或属性。若不想覆盖,可以使用super
函数。
class Derived(Based):
def __init__ (self):
super(). __init__() #执行子类的构造方法前,先调用父类的构造方法
此外,python支持多重继承,但尽量避免使用。
class DerivedClassName(Base1,Base2,Base3):
2.3 多态
多态定义:不同对象对同一方法响应不同行动。
class A:
def fun(self):
print("我是小A…")
class B:
def fun(self):
print("我是小B…")
a=A()
b=B()
a.fun() #我是小A…
b.fun() #我是小B…
3 魔法方法
所谓魔法方法,就是在适当的时候会被调用的方法。可以认为是C++里面BIG_THREE
的变种(构造和析构、操作符重载),当然也有其他类型。这些是有默认版本的,我们可以根据需要进行重载。
1、__init__ (self [,...])
:是对构造方法并且进行初始化。
2、__new__(cls [,...])
:同C++的构造函数。
3、__del__(self)
:同C++的析构函数。
4、__add__ (self,other)
:对加法操作的操作符重载。同理可以操作符重载其他符号。
5、__getattr__(self,name)
:定义当用户试图获取一个不存在的属性时的行为
6、__getattribute__(self,name)
:定义当该类的属性被访问时的行为
7、__setattr__(self,name,value)
:定义当一个属性被设置时的行为
8、__delattr__(self,name)
:定义当一个属性被删除时的行为。
9、__get__(self,instance,owner)
:用于访问属性,它返回属性的值
10、__set__(self,instance,value)
:将在属性分配操作中调用,不返回任何内容
11、__delete__(self,instance)
:控制删除操作,不返回任何内容
还有很多其他魔法方法,具体标志为:魔法方法总是被双下划线包围,请读者自行学习。