Python数据类型:类

1. 魔法方法

Python中方法名以双下划线__作为前缀和后缀的方法叫做魔法方法,魔法方法相当于Java的接口方法,具有特定的功能。

  • __new__:实例化方法,先执行__new__再执行__init__。
  • __init__:初始化方法。
  • __str__:toString()方法。
  • __eq__:用于比较两个对象是否相等。
  • __next__表示迭代器对应的next()方法。

2. self

对象方法必须有参数,而且第一个参数必须是self,这种语法个人很不理解,为什么要显式写self,就不能隐式使用self吗,Java就是隐式的?Python一贯标榜自己语法简洁,不知道在这点上有啥难言之隐。注意:self并不是Python的关键字,处于习惯大家都默认使用self,Java中使用关键字this。

import keyword

# 查看Python中的关键字列表
print(keyword.kwlist)

3. 访问权限约定

Python所提倡的用更多的符号来代替关键字,在Java中定义私有变量要使用private关键字。

  • 私有属性在属性名前使用双下划线命名规则。如:__password
  • 类的私有方法也是在方法名前使用双下划线前缀。如 __set_password
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)

4. 静态方法和类方法

  • 静态方法@staticmethod相对于对象方法的区别是第一个参数不需要声明self
  • 类方法@classmethod和静态方法的区别是类方法需要显式定义cls参数
class Person:
    def __init__(self, name=None, age=None):
        self._name = name
        self._age = age

    @staticmethod
    def hello():
        print('hello')

    @classmethod
    def instance(cls, name, age):
        return cls(name, age)


if __name__ == '__main__':
    # hello
    Person.hello()
    person = Person.instance('张三', 30)
    # 张三
    print(person._name)

5. 抽象方法

Python认为一个方法没有方法体,即方法体位pass就可以认为是一个抽象方法,Python一直在倡导约定大于语法,所以也没有提供什么语法强制校验,毕竟程序员要对自己写的代码负责。Python虽然没有把抽象方法作为一级语法,但是也可以在运行时检测抽象方法有没有实现,没有实现就抛异常,需要通过abc模块来检查。TypeError: Can't instantiate abstract class Chinese with abstract method hello

Python中只有class关键字,没有接口interface关键字,Python认为一个类中的所有方法的方法体都是pass,那么这个类就算一个接口。

from abc import ABCMeta, abstractmethod


class Person(metaclass=ABCMeta):
    def __init__(self, name=None, age=None):
        self._name = name
        self._age = age

    @abstractmethod
    def hello(self):
        pass


class Chinese(Person):
    pass


if __name__ == '__main__':
    chinese = Chinese()
    chinese.hello()
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值