1. 语法
Python中类有一些特殊的方法,方法名都是以双下划线__作为前缀和后缀,这是Python中定义好的方法,Python中有很多这种方法。
__init__
表示构造方法__str__
表示Java中的toString()方法__next__
表示迭代器对应的next()方法
def __init__(self):
pass
类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称, 按照惯例它的名称是 self。类中的方法第一个参数必须是self(通常,也可以叫别的名字),这种语法个人很不理解,为什么要显式写self,其它语言中都没见过这种语法,就不能隐式使用self吗?如果类中的方法没有一个参数会报错:takes 0 positional arguments but 1 was given Python一贯标榜自己语法简洁,感觉显式self语法和Python宣传的经验相反。在Java中可以隐式的使用this关键字,在Python中self并不是关键字。
import keyword
# 查看Python中的关键字列表
print(keyword.kwlist)
私有属性在属性名前使用双下划线命名规则, 类的私有方法也是在方法名前使用双下划线前缀。如 __weight, 这点就是Python所提倡的用更多的符号来代替关键字,在Java中定义私有变量要使用private关键字。
Python中继承写在小括号里,如class Foobar(object), Python中支持多继承,多个父类使用逗号分隔,如class Foobar(SuperClass1, SuperClass2)
super类可以通过构造函数获取某个对象的父类,从而调用父类的方法,如 super(Student, zhangsan).say_hello()
Python中的类可以重写加减乘除运算方法来对对象进行运算。__add__、__sub__、__mul__、__divmod__
2. Python中的类是不支持方法重载的
class Person:
country = "China"
def say_hello(self):
print("I'm Chinese")
class Student(Person):
name = None
age = 0
__weight = 60
def __init__(self):
pass
def __init__(self, name, age):
self.name = name
self.age = age
def say_hello(self):
print("I'm Student")
def __private_func(self):
print("私有函数")
def __add__(self, other):
return Student(self.name + other.name, self.age + other.age)
zhangsan = Student("zhangsan", 26)
zhangsan.say_hello()
super(Student, zhangsan).say_hello()
lisi = Student("lisi", 24)
zhangli = zhangsan + lisi
print(zhangli.age)
Java方法重载
public class Student {
private String name;
private String phone;
private Integer age;
public Student() {
}
public Student(String name) {
this.name = name;
}
public Student(String name, String phone) {
this.name = name;
this.phone = phone;
}
public Student(String phone, Integer age, String name) {
this.name = name;
this.phone = phone;
this.age = age;
}
public Student(String name, String phone, Integer age) {
this.name = name;
this.phone = phone;
this.age = age;
}
public static void main(String[] args) {
Student student = new Student();
Student zhangsan = new Student("zhangsan");
Student lisi = new Student("lisi", "188888888888");
Student wangwu = new Student("wangwu", "188888888888", 26);
Student fengliu = new Student("fengliu", 26, "188888888888");
}
}
Python错误示例
class Student:
name = None
phone = None
age = 30
def __init__(self):
pass
def __init__(self, name):
self.name = name
def __init__(self, name, phone):
self.name = name
self.phone = phone
def __init__(self, name, phone, age):
self.name = name
self.phone = phone
self.age = age
# TypeError: __init__() missing 3 required positional arguments: 'name', 'phone', and 'age'
student = Student()
Python中没有方法重载功能
当方法参数类型不同、顺序不同或者参数个数不同,但是方法的功能是一样并且方法名相同算方法重载。
- 方法参数类型不同时使用重载,Python中在定义方法参数时时不指定参数类型的,所以这种情况在Python中不存在
- 方法参数个数相同但顺序不同时使用重载,方法参数顺序不同的主要原因是因为数据类型不同,同样Python中在定义方法参数时时不指定参数类型的,所以这种情况在Python中不存在
- 方法个数不同时重载,在Python中可以通过列举一个最全的参数列表,然后将可选的参数提供一个默认值来间接实现方法重载。对于参数顺序不一样的Python可以通过关键字参数来实现。
class Student:
name = None
phone = None
age = 30
def __init__(self, name=None, phone=None, age=18):
self.name = name
self.phone = phone
self.age = age
student = Student()
zhangsan = Student("zhangsan")
lisi = Student("lisi", "188888888888")
wangwu = Student("wangwu", "188888888888", 26)
fengliu = Student(name="fengliu", age=30, phone="188888888888")
3. python3.8中面向对象只有类class的概念,没有接口interface的概念
4. 常用的异常类
异常 | 描述 |
---|---|
BaseException | 所有异常的基类 |
Exception | 常规错误的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
SystemExit | Python 解释器请求退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |