• python


    类和对象

    类(Class):字段和方法是类的属性。(这两个术语,用以区分普通的变量和函数)只有当你拥有一个该类的对象时,你才能使用这些字段和方法。

    对象(Object):是类的实例

    1 class Person:  # 类:关键字class 类名 冒号
    2     pass
    3 
    4 
    5 p = Person()  # 对象:类名后跟一对括号
    6 print(p)      # 打印 <__main__.Person object at 0x00532E08>

    self:

    类方法与普通函数只一个区别,类方法必须有一个额外的参数self,位于参数列表开头,但是不用在调用这个方法时为这个参数赋值,python会自动为它提供。这种特定的变量引用的是对象本身。如果你有一个没有参数的方法,也至少有一个参数self。

    1 class Person:
    2     def say_hi(self):  # say_hi()方法不需要参数,但函数定义中仍有self
    3         print('hi')
    4 
    5 
    6 p = Person()
    7 p.say_hi()

    __init__()方法

     1 class Person:
     2     def __init__(self, name):   # 构造函数,在类的对象初始化时自动调用
     3         self.name = name
     4 
     5     def say_hi(self):
     6         print('hi,my name is {}'.format(self.name))
     7 
     8 
     9 p = Person('zhangsan')  # 隐式调用__init__()方法
    10 p.say_hi()

    实例变量和类变量

    类的字段有两种类型:类变量与对象变量。它们根据是类还是对象拥有这些变量来分类。

    • 类变量:是共享的,它们可以被属于该类的所有实例访问。该类变量只有一个副本,当任何一个对象对类变量做出改变时,发生的变动将在其它所有实例中得到体现。
    • 对象变量:由类的每一个独立的对象或实例所拥有。每个对象都拥有属于自己的字段副本,也就是说,它们不会被共享,也不会以任何方式与其它不同实例中的相同名称的字段产生关联。
    • 类方法:属于类的方法,也叫静态方法。该方法中引用类变量。可以使用装饰器将一个方法标记为类方法
    引用类变量:类名.变量名
    引用对象变量:self.变量名
    引用类方法:类名.方法名
    1
    class Robot: 2 number = 0 # number属于Robot类,因此它是一个类变量 3 4 def __init__(self, name): 5 self.name = name # name属于一个对象,因此它是一个对象变量 6 Robot.number += 1 # 引用类变量(类名.变量名)也可以使用:self.__class__.number += 1 因为每个对象都通过self.__class__属性来引用它的类 7 8 9 def say_hi(self): 10 print('hi, my name is {}'.format(self.name)) # 引用对象变量(self.变量名) 11 12 @classmethod # 使用装饰器decorator将print_num()方法标记为类方法 13 def print_num(self): 14 print('the number of robot is {}'.format(Robot.number)) 15 16 17 r = Robot('DD1') 18 r.say_hi() 19 Robot.print_num() # 使用类方法

    私有变量:

    所有类成员都是公开的,除非使用双下划线作为前缀,例如:__privatevar,python会认为是一个私有变量

    继承:

    1. 父类,子类

     1 class SchoolMember:
     2     def __init__(self, name, age):
     3         self.name = name
     4         self.age = age
     5         print('initialized SchoolMember: {}'.format(self.name))
     6 
     7     def tell(self):
     8         print('name: {}, age: {}'.format(self.name, self.age), end=' ')
     9 
    10 
    11 class Teacher(SchoolMember):  # 继承SchoolMember
    12     def __init__(self, name, age, salary):
    13         SchoolMember.__init__(self, name, age)  # 通过self显式调用父类的__init__方法(如果子类没有定义__init__方法,python会自动调用基类的构造函数)
    14         self.salary = salary
    15         print('initialized Teacher: {}'.format(name))
    16 
    17     def tell(self):
    18         SchoolMember.tell(self)  # 在方法名前面加上类名,再传入self和其他变量,来调用基类方法
    19         print('salary:{}'.format(self.salary))
    20 
    21 
    22 class Student(SchoolMember):
    23     def __init__(self, name, age, marks):
    24         SchoolMember.__init__(self, name, age)
    25         self.marks = marks
    26         print('initialized Student: {}'.format(self.name))
    27 
    28     def tell(self):
    29         SchoolMember.tell(self)
    30         print('marks: {}'.format(self.marks))
    31 
    32 
    33 t = Teacher('wanglaoshi', 80, 20000)
    34 s = Student('lisi', 22, 98)
    35 
    36 mm = [t, s]
    37 
    38 for member in mm:
    39     member.tell()    # 当使用SchoolMember类的tell()方法时,可以将Teacher或Student的实例看做SchoolMember的实例。python会从当前的实际类型中寻找方法,若子类中未定义tell()方法,则会调用父类的tell()方法

    2. 多态性:在不考虑实例类型的情况下使用实例,也就是说,不同类型的实例有相同的调用方法。比如上例中的Teacher、Student、SchoolMember都有tell()方法,t和s可以以相同的形式调用tell()方法。优点:增加程序的可扩展性,例如,SchoolMember增加新的子类,使用者无需更改自己的代码,还是用tell()方法去调用

    3. 多重继承:继承元组中有超过一个类,例如:

     1 class B:
     2     pass
     3 
     4 
     5 class C:
     6     pass
     7 
     8 
     9 class A(B, C):  # 多重继承(继承B和C)
    10     pass
  • 相关阅读:
    adb命令之adb install
    GNU make and Makefile
    Makefile经典教程(掌握这些足够)
    Android.mk简介
    PhoneFactory.getDefaultPhone must be called from Looper thread
    Android源码目录结构
    软件部通用技术类网站名录
    β测试
    α测试
    白盒测试
  • 原文地址:https://www.cnblogs.com/xiaochongc/p/12274536.html
Copyright © 2020-2023  润新知