Python中,类的命名使用帕斯卡命名方式,即首字母大写。python
Python中定义类的方式以下:git
class 类名([父类名[,父类名[,...]]]): pass
省略父类名表示该类直接继承自object
,类的实例化以下:编程
class Person(): def __init__(self): pass person=Person()
__init__()
是类的构造函数,在实例化时调用,它的参数self
表示类实例。ide
字段的访问级别:函数
上述访问级别更多的是一种编程约定,即使是以双下划线开头的字段,在类的外部也是能够访问的,但不建议这么作。示例代码以下:ui
class Person(): age = 24 _name = 'person' __family_name = 'securate' def __init__(self): print('Person init')
Person类成员:google
在上图中,咱们能够看到类中并无出现一双下划线开头的字段__family_name,而多出一个_Person__family_name。说明类实例不能够直接访问__family_name,但能够经过实例名._Person__family_name
的方式来访问。spa
上述三种类型的变量都可以经过类或类实例进行访问。经过self
定义的变量只能经过类实例进行访问,如self.country
,变量country
只能经过类实例进行访问。.net
Python中方法名均为小写字母,不一样单词间如下划线进行分割。3d
Python类中没有方法的重载,对于具备相同名称的方法,后面的定义会覆盖掉前面的定义;子类会覆盖父类中同名的方法。在Person类中定义两个同名方法say
:
def say(self, message): print(message) def say(self, info): print('second: '+info) person=Person() person.say('invoke')
程序执行结果:
从程序运行结果可知,调用的是定义在后面的say(self, info)
方法。
以双下划线开头和结尾的方法属于特殊方法,如:__init__(self)
、__call__(self)
等内置方法。在咱们本身定义方法时不建议采起这种方式。
和字段相似,上述访问级别也只是一种编程约定,即使是以双下划线开头的方法,在类的外部也是能够访问的,但不建议这么作。
定义方法时,没有装饰器修饰且带有参数的(能够不是self),即为实例方法。
类外部经过类实例来调用,类内部经过self.方法名
来调用。
def method(self): pass
@classmethod是Python中的装饰器。
使用@classmethod
修饰的方法,必需要带参数(默认参数名是cls),该参数表示类自身。能够经过类自身或者类实例调用@classmethod
修饰的方法。在@classmethod
修饰的方法中没法访问实例成员,但能够经过cls或者类名访问类中的字段。
使用@staticmethod
修饰的方法能够没有参数,能够经过类或者类实例调用。在@staticmethod
修饰的方法中,没法访问类中的实例成员,能够经过类名访问类中的字段。
定义一个Chinese类,继承自Person类:
class Chinese(Person): def __init__(self): pass chinese=Chinese()
Chinese中的字段:
从Chinese类型的实例中,咱们能够看到Chinese类继承了除country
以外的全部字段。
子类还会继承父类中的函数,若子类没有实现本身的构造函数(__init__(self)
),那么在实例化子类时会调用父类的构造函数。
class Person(): def __init__(self): pass def convert(self, class_type): if issubclass(class_type, Person): return (class_type)(self) class Chinese(Person): def __init__(self, convert=None): pass def cn_method(self): print('chinese') class Japanese(Person): def __init__(self, convert=None): pass
执行类型转换:
jap = Japanese() cn = jap.convert(Chinese) cn.cn_method()
类型转换结果以下图:
能够看到,根据Japanese实例获得了Chinese类型实例。这里的转换只是获取了Chinese类型的实例cn,而原有的Japanese类型实例依然存在于内存中。
程序执行结果以下图:
飘逸的python - @staticmethod和@classmethod的做用与区别
Difference between @staticmethod and @classmethod in Python