和Java一样,Python也是面向对象编程语言,对于一个Python developer来说,The Zen Of Python简直不要太爽。在创建一个类然后声明类中的方法和变量上,Python的代码量比Java要简洁一些,现对比两种语言同样的一个狗类的实现方式。
Python中的类,方法以及变量:
class Dog(object): """狗类""" # 类属性,这个类以及子类子孙类及外部继承这个类的子类甚至导入这个类时都能访问,相当于Java中的 public static int leg = 4; leg = 4 # 4条腿 # 单下划线,私有类属性,这个类以及子类都能访问,但是除了这个py文件之外的其他文件均不能访问,不能通过导入的方式导入这个属性,相当于Java中的 protected _dogType = "哈士奇" # 狗的品种 # 私有类属性,只能在这个类的内部访问,其余地方均不能访问,相当于java中的private __dogColor = "白色" # 狗的毛色 @staticmethod def introduce(): """静态方法""" print("我是一只小狗狗") @classmethod def eat(cls): """类方法""" print("我喜欢吃骨头") def __init__(self, name, age): """构造方法之一,在实例化对象之后自动调用,给对象增加属性""" # 实例属性,对象能够直接访问 self.name = name self.age = age # 私有属性,对象不能直接访问,只能通过方法访问 self.__weight = 20 def run(self): print("二哈飞快的跑了过去") def get_weight(self): return self.__weight def set_weight(self, weight): self.__weight = weight print("{}吃了骨头,现在体重为{}kg".format(self.name, self.__weight)) # 程序入口,相当于java中的main函数 if __name__ == '__main__': peiqi = Dog("佩奇", 18) print(peiqi.name) # 输出 "佩奇" print(peiqi.age) # 输出 18 print(peiqi._dogType) # 输出 "哈士奇" print(peiqi.__dogColor) # 报错,不能访问双下划线的私有类属性 print(peiqi.__weight) # 报错,不能直接访问对象的私有属性,只能通过方法修改和访问 print(peiqi.get_weight()) # 输出 20 peiqi.set_weight(30) # 输出 "佩奇吃了骨头,现在体重为30kg" print(peiqi.get_weight()) # 输出 30
总结:Python中对于属性(变量)声明,无下划线表示公有属性,单下划线表示私有属性,包中可访问,但是外界不能导入,双下划线表示私有属性,类中可以使用,其他地方均不能使用,此规则同样适用于方法。Python类中通过@classmethod修饰的方法参数里有cls的是类方法,类方法可以通过Dog.eat()访问,也可以通过对象.方法名访问。通过@staticmethod修饰的是静态方法,可以不传参数,类和对象均可以访问。括号里有self参数的则为实例方法,不能通过类名.方法名访问,是对象的专有
注意:Python中以双下划线开头,以双下划线结尾的变量是Python自带的特殊变量,全局均可访问,所以强烈建议自己不要定义这样的变量名!
Java中的类、方法以及变量:
package practice; public class Dog { // 狗的腿数 public static int leg = 4; // 狗的品种 protected static String dogType = "哈士奇"; // 狗的毛色 private static String dogColor = "白色"; // 对象属性 String name; int age; private double weight; // 构造方法 public Dog(String name, int age, double weight) { this.name = name; this.age = age; this.weight = weight; } public void run() { System.out.println("二哈飞快的跑了过去"); } // 静态方法,相当于Python中的@staticmethod修饰符的方法 public static void introduce() { System.out.println("我是一条小狗"); } public void eat() { System.out.println("我喜欢吃骨头"); } // main方法 public static void main(String[] args) { Dog dog = new Dog("佩奇", 18, 20); System.out.println(dog.name); System.out.println(dog.age); System.out.println(dog.weight); dog.eat(); dog.introduce(); dog.run(); } }