#!/usr/bin/env python
# -*- coding:utf-8 -*-
# @Time : 2017/11/06 22:46
# @Author : lijunjiang
# @File : class.py
"""
类有一般形式
使用class 关键字可以创建一个类,class 后为类的名称并 ()表示的继承默认为object 并以冒号结尾,即:
class class_name(object):
'类的帮助信息' #类的文档字符串
class_suite #类体
object 默认是所有类的父类,不写默认继承object
"""
# 创建一个类
class myclass(object):
'''this is a class about myclass'''
myclass_name = 'myclass'
myclass_info = 'is a class'
def myclass_func(self):
print('hello, is a my first class!')
"""
说明:
myclass_name和myclass_info 是类myclass的两个变量,它们的值将在这个类所有的实例间共享,可能使用
实例名.myclass_name 或 实例名.myclass_info 访问这两个变量
myclass_func 是类的方法,该方法可以在这个类的所有实例中以 实例名.myclass_func() 的方式调用
"""
# 类的实例化
a = myclass()
print(type(a))
# 执行结果:<class '__main__.myclass'>
# 访问类的变量
print(a.myclass_name)
print(a.myclass_info)
# 执行结果:
# myclass
# is a class
# 调用类的方法
a.myclass_func()
# 执行结果:hello, is a my first class!
# 在实例中改变类变量的值,实例.类变量名 = '要赋的值'
print(a.myclass_name)
a.myclass_name = 'set myclass_name'
print(a.myclass_name)
# 执行结果:
# myclass
# set myclass_name
"""
类的构造器
构造函数:__init__
作用:在生成对象时调用,在创建一个类时,有一些在实例化时必须绑定某些属性时,可以定义一个__init__方法
将其强制填写进去。
例如声明一个ren的类,在实例化时必须填入name 和sex 时
"""
# 声明一个ren的类,具有name sex 属性
class ren(): # 不指定其父类,默认继承object类
def __init__(self, name, sex):
self.name = name
self.sex = sex
# # 创建一个类为ren的man实例,不指定name sex 属性时
# man = ren()
# 执行结果:报错-缺少必要的参数
# Traceback (most recent call last):
# File "D:/Python/class/class1.py", line 80, in <module>
# man = ren()
# TypeError: __init__() takes exactly 3 arguments (1 given)
# 创建一个类为ren的man实例,同时指定name sex
man = ren("man", "m")
print(man.name)
print(man.sex)
# 执行结果:
# man
# m
"""
说明:
类的方法与普通函数只有一个特别的区别-它们必须有一个额外的第一个参数名称,self
参数self 代表类的实例,而非类
在调用时,self参数不用传入,在上例中Python会自动把ren实例化的man传递给第一个参数,即self
在类实例化时,如果在构造函数__init__中声明了类的某些必须属性,则在实例化这个类时,必须传入对应的参数,否则会报错
"""
"""
类的继承
class A()
class B(A)
class C(A,B)
"""
# 声明一个peson类,具有属性name 和sex ,方法 info()
class peson(object):
# name = 'peson'
# sex = 'F or M'
def __init__(self, name='peson', sex='F or M'):
self.name = name
self.sex = sex
def info(self):
print('hello {0},your is a {1}'.format(self.name, self.sex))
# 声明一个man类,继承peson类,具有方法
class man(peson):
def man_func(self):
print('My name is {0}, I am a {1}'.format(self.name, self.sex))
# 初始化一个peson实例
a = peson()
print(a.name)
print(a.sex)
a.info()
# 执行结果:
# peson
# F or M
# hello peson,your is a F or M
#初始化一个man实例
m = man()
print(m.name)
print(m.sex)
m.info()
m.man_func()
print(dir(m))
# 执行结果:
# peson
# F or M
# hello peson,your is a F or M
# My name is peson, I am a F or M
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__',
# '__new__', ' '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__',
# 'info', 'man_func', 'name', 'sex']
"""
由上面例子可以看出:
man 类 继承了 peson 类,拥有poson类的属性name sex 和方法 info(),同时也具有自已的方法 man_func()
"""
print('=====================类的重写==========================')
class peson_new(object):
name = 'peson'
sex = 'F or M'
def __init__(self):
print('hello {0},your is a {1}'.format(self.name, self.sex))
def info(self):
print('This is a function info of peson class')
class man_1(peson_new):
name = 'man'
sex = 'M'
def info(self):
print('This is new function info of man_1 class')
print('peson 类的属性 和 方法')
p = peson_new()
print(p.name)
print(p.sex)
p.info()
print('man_1 类的属性和方法')
m2 = man_1()
print(m2.name)
print(m2.sex)
m2.info()
# 执行结果:
# =====================类的重写==========================
# peson 类的属性 和 方法
# hello peson,your is a F or M
# peson
# F or M
# This is a function info of peson class
# man_1 类的属性和方法
# hello man,your is a M
# man
# M
# This is new function info of man_1 class
"""
在子类中,使用与父类中相同变量或方法名,可以重新定义父类中的属性和方法
"""
print("=====================类的多继承========================")
# 声明一个girl类,同时继 peson 类和 man 类
class girl(man):
def girl_func(self):
print('I like myself ,name is {0}'.format(self.name))
# 声明一个man 实例和一个 gril实例
m1 = man('Dalang Wu',"M")
g = girl('Jinglian Pan', 'F')
# 打印它们的属性
print("man实例属性")
print(m1.name)
print(m1.sex)
print('man实例方法')
m1.info()
m1.man_func()
print('gril实例的属性')
print(g.name)
print(g.sex)
print('gril实例的方法')
g.info()
g.man_func()
g.girl_func()
# 执行结果:
# =====================类的继承========================
# man实例属性
# Dalang Wu
# M
# man实例方法
# hello Dalang Wu,your is a M
# My name is Dalang Wu, I am a M
# gril实例的属性
# Jinglian Pan
# F
# gril实例的方法
# hello Jinglian Pan,your is a F
# My name is Jinglian Pan, I am a F
# I like myself ,name is Jinglian Pan
#
# Process finished with exit code 0
"""
从上例可以看出:
当man类继承了peson类后,man具有了peson类的属性和方法
当girl类同时继承了peson类和man类时,同时具备这两个类的属性和方法
这就是类的多继承
"""