class-类

作者: Drycountry233 | 来源:发表于2018-10-11 00:22 被阅读0次

创建一个类

尝试创建一个简单的类Dog,它包含了属性name、saageary,方法sit、roll_over。具体代码如下(来自Python Crash Course):

class Dog(): # A simple attempt to model a dog.
    empCount = 0
    def __init__(self, name, age): # Initialize name and age attributes.
        self.name = name
        self.age = age
        Dog.empCount = Dog.empCount + 1
    def sit(self): # Simulate a dog sitting in response to a command.
        print(self.name.title() + " is now sitting.")
    def roll_over(self): # Simulate rolling over in response to a command.
        print(self.name.title() + " rolled over!")

my_dog = Dog('willie', 6) # Making an instance from a class.
print("My dog's name is " + my_dog.name.title() + ".")
print("My dog is " + str(my_dog.age) + " years old.")
my_dog.sit()
my_dog.roll_over()
print(Dog.empCount, my_dog.empCount)
----------------------------------终端输出---------------------------------
My dog's name is Willie.
My dog is 6 years old.
Willie is now sitting.
Willie rolled over!
1 1
  • 可以看到变量empCount在类、类的实例间共享,可由类、实例调用,称作xx变量;
  • self代表类的实例(instance),在实例调用类中的方法时(如my_dog.sit()),实例本身(即ZhangSan)自动传递给self,括号中无额外参数;
  • self.name和self.age可被Dog类定义中的各个方法调用,也可被类的实例访问,如my_dog.age;
  • 类的每个方法的定义,均要传递self;

类的继承

在父类Dog的基础上,新定义一个Labrador类,代码如下:

class Dog(): # A simple attempt to model a dog.
    empCount = 0
    def __init__(self, name, age): # Initialize name and age attributes.
        self.name = name
        self.age = age
        Dog.empCount = Dog.empCount + 1
    def sit(self): # Simulate a dog sitting in response to a command.
        print(self.name.title() + " is now sitting.")
    def roll_over(self): # Simulate rolling over in response to a command.
        print(self.name.title() + " rolled over!")

class Labrador(Dog): # model a Labrador this time
    def __init__(self, name , age, sex): # 继承父类的name、age属性,新增sex属性(性别!!)
        super().__init__(name, age) # 采用super()方法来继承父类的属性定义
        self.sex = sex # 新增的属性需要重新定义
    def printsex(self):
        print('My dog is {}'.format(self.sex))
    def roll_over(self): # Simulate rolling over in response to a command.
        print(self.name.title() + " rolled over twice!")


my_dog = Dog('willie', 5)
my_dog2 = Labrador('Tom', 5, 'male')
print("My dog's name is " + my_dog2.name.title() + ".")
print("My dog is " + str(my_dog2.age) + " years old.")
my_dog2.printsex()
my_dog2.sit()
my_dog2.roll_over()
print(Dog.empCount, my_dog2.empCount)
----------------------------------终端输出---------------------------------
My dog's name is Tom.
My dog is 5 years old.
My dog is male
Tom is now sitting.
Tom rolled over twice!
2 2
  • 可见empCount 在父类、子类间也是共享的;
  • 父类的属性必须全部继承,可通过super()方法简化定义;
  • 子类中可以定义新的属性,新增的属性要通过self.attrname = attr定义;
  • 子类中可以对父类的方法进行重新定义,如roll_over()方法,也可以增加新的方法。

类和实例的命名规则

  1. 类的命名采用CamelCaps,即对类名的每个有意义的词的首字母大写,如ElectricCar;
  2. 类名不要用下划线,无论在类名起始位置还是中间位置;
  3. 实例采用小写字母。

相关文章

  • class-类

    创建一个类 尝试创建一个简单的类Dog,它包含了属性name、saageary,方法sit、roll_over。具...

  • isa与meta class

    isa 类的实例对象-》class-〉metaclass metaclass 》root meta class r...

  • 2018-10-17day14-总结

    一、面向对象编程 说明: class->Python中声明类的关键字类名->标识符,不能是关键字;类名使用驼峰式命...

  • GeekBand-OC类与对象

    OC的类型系统 引用类型-类 Class-指针 pointer-块 block 值类型-基础数据类型-结构 str...

  • Android router

    1.注解处理器处理本module中的注解,通过apt生成routermap类2.在打包过程中class->dex过...

  • static inner class-内部私有静态类

    一直认为在加载outer class 的同时也会加载inner class 并且完成静态变量和代码块的初始化 也就...

  • 为什么说Java 是编译与解释共存的语言?

    重点讲.class->机器码 这一步。在这一步 jvm 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这...

  • isa & superclass

    oc 对象调用方法流程 isa instance->isa & ISA_MASK = class class->i...

  • Vue 基础-02-重点

    Vue 基础-day02-重点 01-基础-系统指令-v-bind-绑定 class-对象语法 :class="{...

  • sophix热修复理解

    1、理解android虚拟机加载class流程a.我们写的java文件 ->.class->.dexb.andro...

网友评论

      本文标题:class-类

      本文链接:https://www.haomeiwen.com/subject/grkvaftx.html