Python基础语法(二):类

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中没有方法重载功能

当方法参数类型不同、顺序不同或者参数个数不同,但是方法的功能是一样并且方法名相同算方法重载。

  1. 方法参数类型不同时使用重载,Python中在定义方法参数时时不指定参数类型的,所以这种情况在Python中不存在
  2. 方法参数个数相同但顺序不同时使用重载,方法参数顺序不同的主要原因是因为数据类型不同,同样Python中在定义方法参数时时不指定参数类型的,所以这种情况在Python中不存在
  3. 方法个数不同时重载,在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 用户代码生成的警告
发布了308 篇原创文章 · 获赞 936 · 访问量 133万+

猜你喜欢

转载自blog.csdn.net/vbirdbest/article/details/103419951