python--类和对象

1、定义类

class 类名[(父类列表)]:#(父类列表省略时默认继承object相当于java)
     属性
     方法
例如:

class student:
  no = 0           # 可以直接定义属性,这是类的属性,由类的所有对象共享
  name = '无名'
  
  def __init__(self, no, name):  # 创建实例对象时自动调用的方法
    self.no = no      # 实例对象的 no 属性,可以不需要事先定义,赋值即可。每个实例对象独享。
    self.name = name  # 实例对象的 name 属性,可以不需要事先定义,赋值即可。每个实例对象独享。
  
  def show(self):     # 类的 show() 方法
    print(self.no, self.name, sep='\t')
'''
注意,定义类的方法时的 self 参数是对类的当前实例的引用,用于访问属于该类的变量。
通行的做法是将其命名为 self,但实际可以命名为其它名称,但它必须是类中任意函数的第一个参数。
如,以上 student 类的方法的第一个参数 self 也可以命名为 me 或 this。
'''

2、类对象的引用格式

        类对象.属性或方法

print(s1.no)   # 使用实例对象的 no 属性
s1.show()      # 调用实例对象的 show() 方法,实例的方法对象,调用它时,默认第一个参数就是实例对象自身(即不用显式传递)。
###s1.show() 等价于 student.show(s1)。

3、类对象实例化格式

        类名(参数列表)

        s1 = student(10000, '张三') ###实例化

        实例化操作("调用"类对象)会创建一个空对象。如果要创建带有特定初始状态的自定义实例,则类定义时可以包含
一个名为 __init__() 的特殊方法,在用类创建对象时就自动调用这个方法。
__init__() 函数可以在创建对象时将值赋给对象属性,或者执行其他的操作。

 4、删除实例对象的属性del

4.1 使用 del 关键字:

        s2 = student(10001, '王五')  # 为观察同一类的其它实例对象而创建另一个实例对象
        del s1.name
        s1.show()  # 由于 name 属性已删除,引发报错 AttributeError: 'student' object has no attribute 'name'

         删除实例对象属性只是对当前实例对象起作用,不影响同一类的其它实例对象。

        print(s2.name)  # s2 对象的 name 属性不受影响

4.2 还可以使用 del 关键字删除整个实例对象:

        del s1

5、添加新属性

创建类定义中不存在的属性:

s1.sex = '男'
print(s1.sex)

新增的属性只限于当前实例对象,就象删除属性一样,新增属性丝毫不影响类及其其它实例对象。

6、如果类没有语句,可以使用 pass 代替:

class myclass:
  pas

7、 类外定义函数

def foo(self):
  return print(self.firstname, self.lastname)

class person:
  show = foo    # 类内的属性 show 引用外部定义的函数对象 foo

  def __init__(self, fn, ln):
    self.firstname = fn
	self.lastname = ln

8、静态函数,即第一个参数不是类的实例对象的函数。静态函数使用 @staticmethod 装饰。

class myclass:
  @staticmethod
  def staticfunction():
    print('This is static function')

静态函数无法访问实例对象的属性,因为不知道要访问哪一个实例;但可以访问类的变量(属性),因为那是共享的,
通过类对象即可访问。
可以通过 "类名.静态函数()" 来访问静态函数,也可以使用 "对象名.静态函数()" 来访问静态函数。

特点:静态函数其实就是个普通函数,主要用途是限定命名空间,即只有某个类才用,不适合模块级使用。

9、类函数

1、类函数,即第一个参数是类的函数。类函数使用 @classmethod 装饰。如:
class DateTest():
    def __init__(self, year, month, day):
        self.year = year
        self.day = day
        self.month = month
    def print_date(self):
        print("{}:{}:{}".format(self.year, self.month, self.day))
    @classmethod
    def get_date(cls, string_date):
        year, month, day = map(int, string_date.split('-'))
        return cls(year, month, day)
可以通过 "类名.类函数()" 来访问类函数,也可以使用 "对象名.类函数()" 来访问类函数。类函数主要用来作为构造函数。

10、继承

1、定义子类的格式是:
    #
        class 子类名(父类名列表):
          属性
          方法
    #
        定义人类,作为学生类的父类
        class person:
          def __init__(self, firstname, lastname):
            self.firstname = firstname
            self.lastname = lastname

          def showname(self):
            print(self.firstname, self.lastname)

        定义学生类,继承人类:
        class student(person):
          pass
        由于 student 类只有 pass 而没有其它代码,因此 student 类完全继承了 person 类的
        属性和方法,并且由于没有添加新的属性和方法,因此拥有与 person 类相同的属性和方法。
        s1 = student('刘', '德华')
        s1.showname()

2、方法覆盖
    student 类继承了其父类 person 类的 __init__() 方法,但可以为 student 类新增__init__() 方法,这样子类不再继承其父类的 __init__() 方法了。
    class student(person):
        def __init__(self, firstname, lastname):  # 子类的 __init__() 方法覆盖了其父类的同名方法
            self.firstname = firstname
            self.lastname = lastname

        s1 = student('刘', '德华')
        s1.showname()

    如果要继承父类的 __init__() 方法,可以在子类的 __init__() 方法中调用父类的 __init__() 方法。

    class student(person):
      def __init__(self, firstname, lastname):  # 子类的 __init__() 方法覆盖了其父类的同名方法
          person.__init__(self, firstname, lastname)  # 调用父类的方法

      s1 = student('刘', '德华')
      s1.showname()

3、使用 super() 函数,可以使子类从其父继承所有方法和属性:

    class student(person):
      def __init__(self, firstname, lastname):  # 子类的 __init__() 方法覆盖了其父类的同名方法
        super().__init__(firstname, lastname)   # 调用父类的方法

    s1 = student('刘', '德华')
    s1.showname()

4、子类可以添加新属性和方法:

    class student(person):
      def __init__(self, firstname, lastname, age):  # 子类的 __init__() 方法覆盖了其父类的同名方法
        super().__init__(firstname, lastname)        # 调用父类的方法
        self.age = age   # 添加新属性
	
      def show(self):    # 添加新方法
        print(self.firstname, self.lastname, self.age)
	
    s1 = student('刘', '德华')
    s1.show()
注意:如果在子类中添加一个与父类中的方法同名的方法,则将覆盖父类的方法。
另外,对于多继承的情况,如果多个父类中有同名的方法,则排在 "父类名列表" 中前面的类的方法会 "遮蔽"
后面的父类中的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值